将 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树和左倾红黑树