哪个更容易实现:2-3-4 树还是红黑树?

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 更密切相关。

Don*_*art 4

关于“大量特殊情况”的部分对我来说似乎相当落后(我认为是 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)

冈崎论文中的这个著名定义