【问题标题】:Turn a binary tree array into a one-dimensional array JavaScript将二叉树数组转换为一维数组 JavaScript
【发布时间】:2020-09-29 22:48:39
【问题描述】:

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

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]];
}

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

如果给定数组是[ 8, 2, 5, 1 ],
输出将是[ [ [ [ 1 ], 2 ], 5 ], 8 ]。
如何更改代码,使输出如下所示:[ 1, 2, 5, 8 ]?

【问题讨论】:

    标签: javascript arrays sorting recursion bubble-sort


    【解决方案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]]
    

    。这只是一种审美要求。

    【讨论】:

      【解决方案2】:

      问题在于return 语句

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

      但是,由于 recursive_bubble_sort 要么返回单个元素 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 ]))

      【讨论】:

      • 谢谢,concat() 是我要找的东西,我尝试使用 push() 但没有帮助。
      • 不需要使用splice。 slice 将在没有副作用的情况下完成这项工作。
      • 你也可以return [...recursive_bubble_sort(array.slice(0, -1)), ...array.slice(-1)]; 我觉得这比concat 更干净。
      • @ScottSauyet doesn't work 因为第一个退出条件返回一个简单的项目,这会尝试传播它。为了成功,基本情况应该始终将值包装在一个数组中,但对我来说这是不必要的。
      • 啊,我只是从我自己的版本中复制了return,没有注意到这个变化。但这指向了另一个问题,即对单元素数组进行排序会返回一个标量值,而不是数组。我将添加一个单独的答案。
      猜你喜欢
      • 2021-07-20
      • 1970-01-01
      • 2013-01-27
      • 1970-01-01
      • 2013-04-17
      • 1970-01-01
      • 2016-02-18
      • 2018-02-19
      相关资源
      最近更新 更多