【问题标题】:Creating a Red-Black tree from BST tree - the fastest way?从 BST 树创建红黑树 - 最快的方法?
【发布时间】:2018-04-22 14:59:55
【问题描述】:

我必须为我的大学课程创建和描述一种算法,该算法获取 BST 树 T 并创建满足属性的新 BST 树 T'(并且尽可能快):
1) T' 具有与 T 完全相同的键值
2)T'是一棵红黑树

到目前为止,我只有一个想法:随机化0或1。如果为0,则从T的左子树中获取最大关键节点并将其插入到T'中,否则从右子树中获取最小关键节点T 并将其插入 T'。这是为了确保红黑树至少在某种程度上是平衡的。插入可以是任何标准的 RB 插入。
获得 min/max 的复杂性是 O(h),并且由于需要对 T 中的每个节点重复此操作,因此这将变得相当高。我还可以在左子树的最大节点和右子树的最小节点处保留一个指针,这样可以解决每次遍历树的整个高度的问题。
您如何看待这个解决方案?我很确定它可以做得更好。抱歉,如果有明显更好的解决方案,但我在互联网上找不到答案,而且这只是我在大学的第二个学期,我没有太多编程经验。

【问题讨论】:

    标签: algorithm tree binary-search-tree red-black-tree


    【解决方案1】:

    除非您有其他一些限制或信息,否则最快的方法是忘记原始 BST 的形状。

    只需将键放入有序列表中,然后从中构建完整的二叉树,所有这些都在 O(N) 时间内完成。

    然后,如果存在部分填充的叶级别,则将这些节点涂成红色。其余的都是黑色的。

    【讨论】:

    • 能否请您详细说明如何将密钥放入有序列表中?我只知道如何从 BST 转到中间有根的双向链表。另外,这里的有序列表比双向链表快吗?使用您的方法,您将如何从排序列表构建完整的二叉树?通过遍历列表,将其分成 2 个列表并创建中间元素根,然后重复该过程并将新根链接为子节点?
    • “有序列表”是指按顺序排列的列表。你可以使用数组、链表、双向链表等。例如,计算键,制作适当大小的数组,并进行中序遍历以填充数组。这里有关于如何从数组创建树的更具体的描述:stackoverflow.com/questions/34970804/…
    • 树节点本身可以​​作为一个列表工作,只要让它们都经过正确的孩子。原始的 BST 已经按排序顺序排列,因此您只需在每一步中获取下一个节点。一旦你有了这条直链,就很容易变回平衡树(正如所说,如果你有一个部分填充的底层节点,这些节点是红色的,所有其他的都是黑色的)。
    • @SornelHaetir 是的,没错,但你必须知道如何进行迭代的有序遍历。
    猜你喜欢
    • 2017-09-17
    • 2010-09-06
    • 2012-11-30
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 2021-10-17
    相关资源
    最近更新 更多