【问题标题】:Turning a Binary Tree to a sorted array将二叉树转换为排序数组
【发布时间】:2013-04-17 07:55:10
【问题描述】:

有没有办法将二进制转换为排序数组,而不必遍历每个数组索引的树?

Node root;
Node runner;
int current_smallest;

void findsmallest(Node root){
    //Pre-order traversal
    if(root == null){
        return;
    }else{
        runner = root;
        if(current_smallest == null){
            current_smallest = runner.element;
        }else{
            if(current_smallest > runner.element){
            current_smallest = runner.element;
            }
        }
        findsmallest(runner.left);
        findsmallest(runner.right);
    }   
}

void fill_array( int [] array ){

    for(int i =0; i < array.length(); i++){
        findsmallest(root);
        array[i] = current_smallest;
    }
} 

如您所见,如果树中有很多节点,这可能需要很长时间。 顺便说一句,我忘了表明必须在开始时遍历整个树才能获得数组的长度。

【问题讨论】:

    标签: java sorting binary-search-tree


    【解决方案1】:

    二叉树可以用数组表示;如果是这种情况,您需要做的就是对数组进行排序。

    这里有更多关于在数组中表示树的信息:wikipedia

    这不一定是最节省空间的表示; “带有引用的节点”表示可能会浪费更少的空间。

    【讨论】:

      【解决方案2】:

      你想要的是一个中序遍历,它通常递归实现,如:

      • 遍历左子树。
      • 处理此节点(即作为数组中的下一个元素插入)
      • 遍历右子树。

      【讨论】:

      • 我认为如果树不是 BST,这将不起作用。 OP 要求二叉树而不是二叉搜索树。您的顺序遍历解决方案仅适用于 BST 而不是常规二叉树。唯一的方法是进行树遍历(您可以选择任何树遍历)并将元素存储在数组中,然后对数组进行排序。这将是 O(nlogn)。如果我在这里遗漏了什么或者我的方法不正确,请纠正我。
      【解决方案3】:

      是的,您可以这样做:运行树的in-order traversal,保留数组的当前位置,并将节点的值存储在数组的当前位置。

      您可以递归地进行顺序遍历,也可以使用堆栈数据结构来进行。如果你想递归地做,你可以这样做:

      int fill_array(Node root, int [] array, int pos) {
          if (root.left != null) {
              pos = fill_array(root.left, array, pos);
          }
          array[pos++] = root.element;
          if (root.right != null) {
              pos = fill_array(root.right, array, pos);
          }
          return pos; // return the last position filled in by this invocation
      }
      

      请注意,为了使上述递归过程起作用,调用者必须在传递给函数的array 中分配足够的空间。

      【讨论】:

      • 我认为如果树不是 BST,这将不起作用。 OP 要求二叉树而不是二叉搜索树。您的顺序遍历解决方案仅适用于 BST 而不是常规二叉树。唯一的方法是进行树遍历(您可以选择任何树遍历)并将元素存储在数组中,然后对数组进行排序。这将是 O(nlogn)。如果我在这里遗漏了什么或者我的方法不正确,请纠正我。
      • @CodeHunter 作者在标题中将其称为“二叉树”,但随后在帖子中将其称为“二叉树”,所以我认为他们可能没有意识到二叉树与二叉搜索树的区别。我认为这个答案可以安全地假设它们的意思是“二叉搜索树”。
      猜你喜欢
      • 1970-01-01
      • 2020-12-28
      • 2018-11-05
      • 2015-02-28
      • 2013-11-13
      • 1970-01-01
      • 1970-01-01
      • 2020-08-24
      • 1970-01-01
      相关资源
      最近更新 更多