这是我尝试过的:
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]
我做错了什么?我意识到它从根部跳过了右侧的所有左子树,但是我看不出为什么...
答案 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;
}