如何将红黑BST转换为数组?

时间:2015-08-31 18:42:54

标签: java data-structures red-black-tree

我想将红黑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 

我在这里做错了什么?

1 个答案:

答案 0 :(得分:6)

看起来只有根和最右边的孩子被复制到数组中。您的i值在每次递归调用中都会更改,但在递归调用结束时它不会更新。

让我们说你的树是:

    80
   /  \
  40  120

您的阵列大小为3。

您的第一个电话:

  • i0
  • 与左子女递归调用inOrder
    • i0
    • 使用左子项inOrder递归调用null
    • 将元素40存储在元素0,将i增加到1
    • 使用正确的孩子inOrder递归致电null
    • 返回。
  • 此处i仍为0
  • 将元素80存储在元素0,将i增加到1
  • 使用合适的孩子递归调用inOrder
    • i1
    • 使用左子项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;
}