将二叉树数组转为一维数组JavaScript

Turn a binary tree array into a one-dimensional array JavaScript

我正在尝试对冒泡排序进行递归编程。 到目前为止,这是我的代码:

function recursive_bubble_sort(array) {
    if (array.length === 1) {
        return array;
    }

    for (var i = 0; i < array.length - 1; i++) {
        if (array[i] > array[i + 1]) {
            var temp = array[i];
            array[i] = array[i + 1];
            array[i + 1] = temp;
        }
    }

    return [recursive_bubble_sort(array.splice(0, array.length - 1)), array[array.length -1]];
}

从技术上讲,它对数组进行排序,但 return 不是一维数组,而是反向二叉树结构。

如果给定的数组是 [ 8, 2, 5, 1 ]
输出将是 [ [ [ [ 1 ], 2 ], 5 ], 8 ]
我怎样才能更改代码以使输出如下所示:[ 1, 2, 5, 8 ]?

问题出在return语句

return [recursive_bubble_sort(array.splice(0, array.length - 1)), array[array.length -1]];

但是,由于 recursive_bubble_sort 要么 returns 单个元素 recursive_bubble_sort 要么数组(另一个 return),您需要同时处理两者。

一种简单的方法是只使用 Array#concat - 如果给它一个元素,它会将它添加到数组中,如果给它一个数组,它会添加所有元素。这确保结果始终是平坦的:

你也可以

function recursive_bubble_sort(array) {
    if (array.length === 1) {
        return array[0];
    }

    for (var i = 0; i < array.length - 1; i++) {
        if (array[i] > array[i + 1]) {
            var temp = array[i];
            array[i] = array[i + 1];
            array[i + 1] = temp;
        }
    }

    return [].concat(recursive_bubble_sort(array.splice(0, array.length - 1)), array[array.length -1]);
}

console.log(recursive_bubble_sort([ 8, 2, 5, 1 ]))

这是一个略有不同的版本,使用解构而不是临时变量进行交换和展开运算符来构建输出:

const recursive_bubble_sort = (arr) => {
  if (arr.length < 2) {return arr}

  for (let i = 0; i < arr.length - 1; i ++) {
    if (arr[i] > arr[i + 1]) {
      [arr[i], arr[i + 1]] = [arr[i + 1], arr[i]]
    }
  }

  return [... recursive_bubble_sort (arr.slice(0, -1)), ... arr.slice(-1)]
}

console .log (recursive_bubble_sort ([8, 2, 5, 1]))

最后一行也可以是

  return [... recursive_bubble_sort (arr.slice(0, -1)), arr[arr.length - 1]]

。简直就是审美呼唤。