如何实现在Java二进制搜索树中返回按顺序排序的数组的方法?

时间:2018-10-03 08:25:52

标签: java recursion binary-search-tree inorder

这是我尝试过的:

public int[] sortedArray() {
    int[] array = new int[size()];
    int index = 0;
    traverseInorder(root, array, index);
    return array;
}

private void traverseInorder(Node n, int[] array, int index) {
    if (n != null) {
        traverseInorder(n.left, array, index);
        array[index++] = n.value;
        traverseInorder(n.right, array, index);
    }
}

但是输出不正确。

如果我使用此输入创建树:

{1,5,8,10,12,15,20,22,25,36,30,40,28,38,48,45,50}

通过sortedArray获得的输出是:

[1, 5, 8, 10, 12, 15, 20, 22, 25, 36, 40, 48, 50, 0, 0, 0, 0]

我做错了什么?我意识到它从根部跳过了右侧的所有左子树,但是我看不出为什么...

2 个答案:

答案 0 :(得分:0)

您将覆盖写入数组的所有左子树元素。

假设您以指定的顺序将节点添加到树中,则会得到以下(极端不平衡的)树:

   1
    \
     5
      \
       8
        \
         10
          \
           12
            \
             15
               \
                20
                 \
                  22
                   \
                    25
                     \
                     36
                    /  \
                   30   40
                  /    /  \
                 28   38   48
                          /  \
                         45   50

您可以看到有序输出(28、30、38和45)中缺少的4个元素全部属于左子树。

该行为的原因是,在traverseInorder(n.left, array, index);将左子树写入数组并返回后,它对index所做的任何更改都是本地的,因此array[index++] = n.value;和{ {1}}覆盖先前写入数组的左子树的值。

要解决此问题,您的递归方法应返回更新的索引:

traverseInorder(n.right, array, index)

答案 1 :(得分:0)

将您的“ traverseInorder” 功能更改为以下给定的功能。希望这种递归应该能起作用。

 private int traverseInorder(Node n, int[] array, int index)
 {
 if(n.left != null)
 index =  traverseInorder(n.left, array, index);

 array[index++] = n.value;

 if(n.right != null)
 index =  traverseInorder(n.right, array, index);

   return index;
}