【问题标题】:How to convert a red black BST into an array?如何将红黑BST转换为数组?
【发布时间】:2015-11-25 21:03:07
【问题描述】:

我想将一个红黑 BST 转换为一个数组,但是出了点问题,我不知道是什么。 这是我用来执行此操作的 sn-p 代码:

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的数字后,输出如下(我使用前序遍历来查看树是否保持平衡):

[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 

我在这里做错了什么?

【问题讨论】:

  • 第一个输出是什么?它没有排序,我希望它来自红黑树
  • @Dici 产生第一个输出,我使用了前序遍历。这就是为什么它看起来像这样。我需要知道树是否保持平衡,在插入节点后调用toString() 可以观察到。
  • @RenatKaitmazov 你为什么要 ping 我?
  • 对不起,我不小心弄到了。
  • 好的,问题是你永远不会更新i 的值,或者更准确地说,你是在本地进行的,它不会影响递归调用。更多细节在 rgettman 的回答中

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


【解决方案1】:

看起来只有根和最右边的孩子被复制到数组中。您的 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]

让每个递归调用 returni 的值返回给它的调用者,以便 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;
}

【讨论】:

    猜你喜欢
    • 2021-05-30
    • 2021-08-19
    • 2016-03-18
    • 2019-07-09
    • 1970-01-01
    • 2023-03-03
    • 2012-10-11
    • 2016-06-27
    相关资源
    最近更新 更多