算法-15-平衡查找树

目录

1、背景

2、2-3查找树

3、查找

4、向2-结点树中插入新键

5、向3-结点树中插入一个新键

6、向一个父结点为2-结点的3-结点树中插入新键

7、向一个父结点为3-结点的3-结点树中插入新键

8、分解根节点

9、4-结点分解的6种情况

10、2-3树的构造轨迹

扫描二维码关注公众号,回复: 11195117 查看本文章

1、背景

前面我们讲到,使用二叉查找树的算法的运行时间取决于树的形状,而 树的形状又取决于键被插入的先后顺序。在最好的情况下, 一棵含有 N 个结点的树是完全平衡的,每条空链接和根结点 的距离都为~ lgN。在最坏的情况下,搜索路径上可能有 N 个结点。但在一般情况下树的形状和最好情 况更接近。

理想情况下我们希望能够保持二分查找树的平衡性。在一棵含有 N 个结点的树中, 我们希望树高为~lgN,这样我们就能保证所有查找都能在~lgN次比较内结束,就和二分查找一样(请 见命题 B)。不幸的是,在动态插入中保证树的完美平衡的代价太高了。在本节中,我们稍稍放松 完美平衡的要求并将学习一种能够保证符号表 API 中所有操作(范围查找除外)均能够在对数时间 内完成的数据结构。

2、2-3查找树

定义。一棵 2-3 查找树或为一棵空树,或由以下结点组成: 2- 结点含有一个键(及其对应的值)和两条链接,左链接指向的 2-3 树中的键都小于 该结点,右链接指向的 2-3 树中的键都大于该结点。 3- 结点含有两个键(及其对应的值)和三条链接,左链接指向的 2-3 树中的键都小 于该结点,中链接指向的 2-3 树中的键都位于该结点的两个键之间,右链接指向的 2-3 树中的键都大于该结点。 和以前一样,我们将指向一棵空树的链接称为空链接.

 

注意:一棵完美平衡的 2-3 查找树中的所有空链接到根结点的距离都应该是相同的。

3、查找

对于2-3查找树的查找,2-结点的查找就是先比较父结点,小于父结点去左子树查找,大于父结点去右子树查找;对于3-结点,先比较父结点中的两个结点是否与要查找的key相等,不相等话,更具区间,去对应的三个子树中去查找。

4、向2-结点树中插入新键

如果我们要给一个2-结点的树中插入一个新键的话,我们不是将该键插入到树的底部,这样就会破坏树的平衡性,我们要做的就是将这个2-结点树变成一个3-结点树。

5、向3-结点树中插入一个新键

假设我们这颗2-3结点只有一个3-结点树,当我们插入一个新键的时候,我们需要先把它变成一个4-结点树(3个键,四条链接)然后再把它转换成一颗3个2-结点的树,这样我们就保证了树的平衡性。

6、向一个父结点为2-结点的3-结点树中插入新键

为了保证树的平衡性,我们首先需要把这个3-结点变成一个4-结点的树,然后把4-结点中3个键中间那个键移动给父结点,同时拆分这个4-结点为2个2-结点。

7、向一个父结点为3-结点的3-结点树中插入新键

8、分解根节点

9、4-结点分解的6种情况

4- 结点的分解是一次局部变换,不会影响树的有序性和平衡性 。

在一棵大小为 N 的 2-3 树中,查找和插入操作访问的结点必然不超过 lgN 个。

10、2-3树的构造轨迹

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

原创文章 120 获赞 34 访问量 28万+

猜你喜欢

转载自blog.csdn.net/qq_34589749/article/details/104224265