我想将红黑BST转换为数组,但出了点问题,我无法弄清楚是什么。 以下是我用来执行此操作的代码片段:
public T[] toArray() {
T[] array = (T[]) Array.newInstance(clazz, count);
inOrder(root, array, 0);
return array;
}
private void inOrder(Node<T> node, T[] array, int i) {
if (node != null) {
inOrder(node.leftChild(), array, i);
array[i++] = node.data();
inOrder(node.rightChild(), array, i);
}
}
按升序从10到200插入数字后,输出看起来像这样(我使用preorder遍历查看树是否保持平衡):
[80, 40, 20, 10, 30, 60, 50, 70, 120, 100, 90, 110, 140, 130, 160, 150, 170, 180]
但是当我调用toArray()
方法时,我得到了这个:
80 120 140 160 170 180 null null null null null null null null null null null null
我在这里做错了什么?
答案 0 :(得分:6)
看起来只有根和最右边的孩子被复制到数组中。您的i
值在每次递归调用中都会更改,但在递归调用结束时它不会更新。
让我们说你的树是:
80
/ \
40 120
您的阵列大小为3。
您的第一个电话:
i
是0
。inOrder
:
i
是0
。inOrder
递归调用null
。40
存储在元素0
,将i
增加到1
。inOrder
递归致电null
。i
仍为0
!80
存储在元素0
,将i
增加到1
。inOrder
:
i
是1
。inOrder
递归调用null
。120
存储在元素1
,将i
增加到2
。inOrder
递归致电null
。结果为[80, 120, null]
。
将每个递归调用return
的值i
返回给调用者,以便i
在所有递归级别保持更新。
private int inOrder(Node<T> node, T[] array, int i) {
if (node != null) {
i = inOrder(node.leftChild(), array, i);
array[i++] = node.data();
i = inOrder(node.rightChild(), array, i);
}
return i;
}