一、2-3-4树和红黑树的关系
可以证明2-3-4树和红黑树在数学上是同构(等价)的。在历史上,也是2-3-4树先被提出来,后来红黑树由它发展而来。
二、如何把2-3-4树转为红黑树
有三条规则分别对应有2,3,4个子节点的情况:
1、若该节点有两个子节点,则把该节点转为红黑树中的黑色节点。
2、若该节点有三个子节点,则节点中存有两个数据项,将这节点转为两个节点中来存储这两个数据项,这两个节点构成父子关系。并把父节点设为黑色节点。把该节点的子节点中的两个拿出来作为新生成子节点的子节点,剩下的一个子节点直接连接在新生成的父节点上。有根据生成子节点的左右关系有两种生成方式:
3、若该节点有四个子节点,则存有三个数据项。我们将该节点其转化为一个父节点和两个子节点。把父节点设为黑色节点,再把原来的四个子节点连接到新的子节点上即可。
可以验证按照上述三个规则,把一个2-3-4树转换后形成的树,是符合红黑树的规则的,就是一颗红黑树。
也可验证红黑树的颜色变换和2-3-4树的4-节点分裂操作是等价的
红黑树的旋转操作和2-3-4树的3-节点分裂等价
三、两者的效率分析:
与一般的二叉搜索树一样,红黑树的查找、插入和删除的时间复杂度都是O(logN),存储空间上多了一个存储颜色的boolean变量。事实上,红黑树的插入操作比普通二叉搜索树要慢一点,因为在插入过程中需要进行一些一切其他操作以保证树的平衡。这点消耗是值得的,这使得红黑树对有序数据的操作不会慢到O(N)的地步。
2-3-4树的复杂度与红黑树一致,但是存储空间的利用率没有红黑树高。但是在java语言中,存储的往往是对象的引用而不是对象本身,这就使得两者差异没那么重要了。可以看出2-3-4树的java实现要比红黑树简单,所以更加常用。对于其他保存数据不是引用的语言平台,则需要慎重考虑两者的优劣。
四、关于树中的删除操作
在树中删除一个节点是十分复杂的。一种解决方法是在节点中加入一个boolean数据项,用来表示该节点是否存在或删除。这种方法并没有把节点从树中正真移除,只是我们不能再去访问这个节点的内容而已。
参考文献:
java数据结构与算法(第二版)