The*_*111 5 b-tree red-black-tree data-structures
我从 (Lafore) 学习的教科书首先介绍了红黑树,并且不包含任何伪代码,尽管所介绍的相关算法似乎相当复杂,有许多独特的情况。
接下来,他展示了 2-3-4 棵树,在我看来,这些树更容易理解,我猜想实现。他包含了一些非常清晰的实际 Java 代码。他似乎暗示 2-3-4 更容易实施,根据我目前所见,我同意。
然而,维基百科的说法相反......我认为这可能是不正确的:
http://en.wikipedia.org/wiki/2-3-4_tree
2-3-4 树是红黑树的等距,这意味着它们是等效的数据结构。换句话说,对于每棵 2-3-4 树,至少存在一棵数据元素顺序相同的红黑树。而且,2-3-4树上引起节点扩展、分裂和合并的插入和删除操作等价于红黑树中的颜色翻转和旋转。红黑树的介绍通常先介绍2-3-4树,因为它们在概念上更简单。然而,2-3-4 树可能难以在大多数编程语言中实现,因为树上的操作涉及大量特殊情况。红黑树更易于实现,因此倾向于使用。
具体来说,关于“大量特殊情况”的部分对我来说似乎很落后(我认为是具有大量特殊情况的RB,而不是2-3-4)。但是,我仍在学习(老实说,我还没有完全了解红黑树),所以我很想听听其他意见。
作为旁注......虽然我同意 Lafore 所说的大部分内容,但我认为与维基百科所说的常见内容(RB 之前的 2-3-4)相比,他以相反的顺序呈现它们很有趣。我确实认为首先使用 2-3-4 会更有意义,因为 RB 很难概念化。也许他选择这个顺序是因为 RB 与他在上一章中刚刚完成的 BST 更密切相关。
关于“大量特殊情况”的部分对我来说似乎相当落后(我认为是 RB 拥有大量特殊情况,而不是 2-3-4)
如果您的语言中有模式匹配,RB 树可以用十几行来实现:
data Color = R | B
data Tree a = E | T Color (Tree a) a (Tree a)
balance :: Color -> Tree a -> a -> Tree a -> Tree a
balance B (T R (T R a x b) y c ) z d = T R (T B a x b) y (T B c z d)
balance B (T R a x (T R b y c)) z d = T R (T B a x b) y (T B c z d)
balance B a x (T R (T R b y c) z d ) = T R (T B a x b) y (T B c z d)
balance B a x (T R b y (T R c z d)) = T R (T B a x b) y (T B c z d)
balance col a x b = T col a x b
insert :: Ord a => a -> Tree a -> Tree a
insert x s = T B a y b where
ins E = T R E x E
ins s@(T col a y b)
| x < y = balance col (ins a) y b
| x > y = balance col a y (ins b)
| otherwise = s
T _ a y b = ins s
Run Code Online (Sandbox Code Playgroud)
冈崎论文中的这个著名定义