多叉树、2-3-4树

多叉树

非叶节点的子节点可以多于两个

2-3-4树

2-3-4树的非叶节点可能含有两个、三个或四个子节点,所以叫2-3-4树;2-3-4树的非叶节点最多可以有4个子节点,所以又叫4叉树。有两个子节点的节点叫2-节点,有三个子节点的节点叫3-节点,有四个子节点的节点叫4-节点。

对非叶节点来说,节点有一个数据项总是有两个子节点,节点有两个数据项总是有三个子节点,节点有三个数据项总是有四个子节点,非叶节点最多有三个数据项和四个子节点。

所有的叶节点都在同一层上。叶节点可能含有一个、两个或三个数据项,不存在空节点。

2-3-4树的数据项的关键字也是有序的,和二叉搜索树一样;2-3-4树中一般不允许出现重复的关键字。

2-3-4树也是平衡树,即使插入一列升序或降序的的数据它依然能保持平衡。

2-3-4树不可能全部都是满节点。

效率比红黑树稍差。

查找

和二叉搜索树类似

插入

新的数据总是插在叶节点里,在查找插入的路径上,碰到满节点时,满节点要分裂,正是这种分裂保证了树的平衡。

分裂节点不是根节点的情况:

0、分裂节点的数据项分别是A、B、C

1、创建一个新的空节点,它是分裂节点的右兄弟节点

2、数据A不动,数据B上移到分裂节点的父节点中,数据C平移到新节点

3、断开分裂节点最右边的两个子节点,连接到新节点上

注意:节点分裂是把数据向上向右移动,正是这样的重新排列才保证了树的平衡。

分裂节点是根节点的情况:

1、创建新的根节点,创建新的右兄弟节点

2、其他都一样

一个插入

可以看到即使插入有序的数列,2-3-4树也可以保持平衡,因为它从不产生子节点,只产生父节点。

还可以看到叶子节点总在一层,因为总是插入在叶节点,即使叶节点满了,也只会产生新兄弟节点。

也不会存在空的叶节点,因为叶节点是分裂而来,分裂的时候一定会给新节点赋值。

2-3-4树不可能全部都是满节点。

2-3-4树的实现

Node类的实现可以包括两个数组,itemArray[3]和childArray[4],itemArray是有序数组。

2-3-4树的效率

2-3-4树比相同数据项的红黑树层数少。红黑树的层数大约是log2(N+1);如果2-3-4树的每个节点都是满的,那么它的高度是log4N,是红黑树的一半,不过2-3-4树的节点不可能都是满的,所以它的高度大于log2(N+1)/2之间。2-3-4树的高度小于红黑树的高度,所以它的高度小于log2(N+1)。总体来说2-3-4树的高度在log2(N+1)到log2(N+1)/2之间。
另一方面,2-3-4树要查看的数据项更多,这会增加查找时间。有的节点有一个数据项,有的节点有两个数据项,有的节点有三个数据项,平均是两个数据项,所以2-3-4树的查找时间大约是2*log4N。
2-3-4树增加的数据项可以抵偿高度的减少,因此查找时间和红黑树大致相等,都是O(LogN)

2-3-4树转换黑红树

规则:2-节点转化为一个黑色节点;3-节点转化为两个父子节点,父节点是黑色的,谁转化为父节点无所谓;4-节点中的第二个数据项转化为父节点,黑色。

 

posted @ 2019-01-05 17:08  zhuangrunwei  阅读(265)  评论(0编辑  收藏  举报