Ren*_*zov 4 java red-black-tree data-structures
我想将红黑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);
}
}
Run Code Online (Sandbox Code Playgroud)
在按照升序从10到200插入数字后,输出看起来像这样(我使用preorder遍历来查看树是否保持平衡):
[80, 40, 20, 10, 30, 60, 50, 70, 120, 100, 90, 110, 140, 130, 160, 150, 170, 180]
Run Code Online (Sandbox Code Playgroud)
但是当我调用toArray()
方法时,我得到了这个:
80 120 140 160 170 180 null null null null null null null null null null null null
Run Code Online (Sandbox Code Playgroud)
我在这做错了什么?
看起来只有根和最右边的孩子才会被复制到数组中.您的i
值在每次递归调用中都会更改,但在递归调用结束时不会更新.
假设您的树是:
80
/ \
40 120
Run Code Online (Sandbox Code Playgroud)
你的数组大小为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;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
335 次 |
最近记录: |