将 2-3-4 树转换为红黑树

Posted

技术标签:

【中文标题】将 2-3-4 树转换为红黑树【英文标题】:Converting a 2-3-4 tree into a red black tree 【发布时间】:2016-06-27 14:02:42 【问题描述】:

我正在尝试在 java 中,但无法弄清楚。

我编写了这两个基本类如下,以使问题简单明了,但不知道从这里去哪里。

public class TwoThreeFour<K> 
    public List<K> keys;
    public List<TwoThreeFour<K>> children;


public class RedBlack<K> 
    public K key;
    public boolean isBlack;
    public RedBlack<K> left,right;
    public RedBlack<K key, boolean isBlack, RedBlack<K> left, RedBlack<K> right)
        this.key = key; this.isBlack = isBlack; this.left = left; this.right = right;
    

我假设 2-3-4 树是有效的,并且希望在调用该方法时返回一棵红黑树。

我也尝试过以下代码,但没有成功:

public convert(TwoThreeFour<K> tTF)
    if (ttf.keys.size() == 3)
        RedBlack<K> node = RedBlack<ttf.keys[1], true, RedBlack<ttf.keys[0], false, /* not sure what to put here for left */, /* not sure what to put here for right */), RedBlack<ttf.keys[2], false, /* not sure what to put here for left */, /* not sure what to put here for right */)

等等。对于 keys.size() == 2, 1....

我知道它在理论上必须是递归的,但我很难弄清楚。有什么想法吗?

【问题讨论】:

【参考方案1】:

考虑以下三个规则:

    将 2-3-4 树中的任意 2-node 转换为 红黑树。 将任意3-node转化为子节点和父节点。这 子节点有自己的两个子节点:W 和 X 或 X 和 Y。 父母有另一个孩子:Y 或 W。没关系 哪个项目成为孩子,哪个成为父母。孩子是 红色,父级黑色。 将任何 4 节点 转换为一个父节点和两个子节点,第一个 child 有自己的孩子 W 和 X;第二个孩子有孩子Y 和 Z. 和以前一样,孩子是红色的,父母是 黑色的。

如果您遵循这些规则,就会自动满足红黑规则。这是应用转换后生成的示例树。

希望这能让你继续前进。为了易于理解和详细解释,您可以参考 Robert Lafore 的数据结构一书。

【讨论】:

以上是关于将 2-3-4 树转换为红黑树的主要内容,如果未能解决你的问题,请参考以下文章

数据结构和算法(Golang实现)(29)查找算法-2-3树和左倾红黑树

JDK8的HashMap为啥要引入红黑树?

数据结构~基础2~树《二叉树二叉搜索树AVL树B树红黑树》的设计~红黑树

二叉树红黑树以及Golang实现红黑树

C++ 红黑树

数据结构之红黑树,2-3-4树,插入旋转调整