判断一个二叉链表树是否为二叉排序树_平衡二叉树

458eb42e14beabed080dc15f24e24bb8.png

平衡二叉树是一种二叉排序树,其中每个结点的左子树和右子树的高度差至多等于1。是两位俄罗斯数学家(G.M,Adelons-V.MLandis)共同发明的一种解决平衡二叉树的算法,也称之为AVL树

高度平衡:要么是一颗空树,要么它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1;将二叉树上结点的左子树深度减去右子树深度值称之为平衡因子BF(Balance Factor)。

最小不平衡树:距离插入点最近的,且平衡因子的绝对值大于1的结点为根结点的子树。

平衡二叉树构建基本思想:在构建平衡二叉树的过程中,每当插入一个结点时,先检查是否因插入而破坏的平衡性,若是,则找到最小不平衡子树,在保持二叉排序树特性的前提下,调整最小不平衡子树中各结点之间的链接关系,进行相应的旋转,使之称为新的平衡子树。

平衡二叉树构建的模拟

将数组a[10] = {3,2,1,4,5,6,7,10,9,8}构建二叉排序树。

1.插入结点3,2,1

efe43813e5cd71bdd33bbd9e9174c76d.png
插入结点3,2,1

因平衡因子超过了1,需要进行调整

7aa6f488c1af5831e9f1794f08c2fe09.png
调整后

2.插入结点4

110491170d8223f5b81af1bef7325829.png
插入结点4的效果

3.插入结点5

5c5be0c340f17e4ae168a248f464a1c9.png
插入结点5

调整后

ccb29d0b3b135b1e9ea8537339f65aeb.png
结点5调整后

4.插入6

a8f663ca4992b507839f843a57c17e6a.png
插入6

调整后

c23cb05adf39fe81dd4d0b01f1f5b6f9.png
结点6调整后

5.插入结点7

7fbea633c4558da2d90ad97220291209.png
插入结点7

调整后

78c7de5503818ffb1627e4a2d9c2dc15.png
调整后的结点7

6.插入结点10

32169057e3ec7ecc397dfad03d4bcf89.png
插入结点10

7.插入结点9

d3d386a3f237c9d2c39a7a77fb319921.png
插入结点9

调整后

387818137b73885832dd176ad5c1dd54.png
调整后

但是9比10小不能称为10的右子树

66f051794ed21cc38f902f00ba2abcc1.png
再次调整后

8.插入结点8

481ab8c18f90b85551adc02febd2d618.png
插入结点8

调整后

6d087b1974fb09d631641629f4750064.png
最后得到的结果

代码实现

创建平衡二叉树

1.定义结点

//二叉树的二叉链表结点结构定义

2.右旋

对以p为根的二叉排序树作右旋处理;处理之后p指向新的树根结点,即旋转处理之前的左子树的根结点;

void 

3.左旋

对以P为根的二叉排序树作左旋处理,处理之后P指向新的树根结点,即旋转处理之前的右子树的根结点

void 

4.平衡⼆叉树结点左平衡旋转

三个常量:

LH

对指针T所指结点为根的二叉树作左平衡旋转处理,算法结束后,指针T指向平衡处理后新的根结点

#define LH +1 

5.右平衡树失衡处理

对以指针T所指结点为根的二叉树作右平衡旋转处理,本算法结束时,指针T指向新的根结点

void 

平衡二叉树插入实现

若在平衡的二叉排序树T中不存在和e有相同关键字的结点,则插入一个数据元素为e的新结点,并返回1,否则返回0。若因插入而使二叉排序树失去平衡,则作平衡旋转处理,布尔变量taller反映T长高与否。

思路:

  1. 如果T为空时,则创建一个新结点;
  2. 如果T不为空,判断是否存在相同的结点.如果二叉树中存在相同结点,则不需要插入;
  3. 如果新结点值e小于T的根结点值,则在T的左子树查找;
    1. -如果能在左子树中查找到,则不插入进去.返回False; 如果没有找到,则插入
    2. -插入成功taller为TRUE,说明新结点e已经插入进去; 此时需要判断T的平衡因子;
    3. -如果平衡因子是1,则说明左子树高于右子树,那么需要调用leftBalance进行左平衡旋转处理;
    4. -如果为0或者-1,则说明新插入的结点没有让整颗二叉排序树失去平衡性,只需要修改BF值即可;
  4. 如果新结点值e大于T的根结点值,则在T的右子树查找;
    1. -如果能在右子树中查找到,则不插入进去.返回False; 如果没有找到,则插入
    2. -插入成功taller为TRUE,说明新结点e已经插入进去; 此时需要判断T的平衡因子;
    3. -如果平衡因子是-1,则说明右子树高于左子树,那么需要调用RightBalance进行右平衡旋转处理;
    4. -如果为0或者1,则说明新插入的结点没有让整颗二叉排序树失去平衡性,只需要修改BF值即可;
Status 

二叉排序树查找

/*二叉排序树查找*/

使用和打印

int 

cf2e337cd7c46fa8c2fcdfdaf5bad6bd.png
平衡二叉树的打印
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
平衡二叉树二叉排序树和平衡二叉排序树都是数据结构中用于存储有序元素的特殊类型的二叉树,它们在结构和性能上有一些关键区别: 1. **二叉排序树(Binary Search Tree, BST)**: - 它是一个二叉树,其中每个节点的左子包含的值都小于该节点的值,右子包含的值都大于该节点的值。 - 保证了查找、插入和删除操作的时间复杂度通常为 O(log n)(假设是完全平衡的),但在最坏情况下(退化成链表)可能会退化为 O(n)。 - 平衡性不是其固有属性,如果插入或删除操作导致严重不平衡,性能会下降。 2. **平衡二叉树(Balanced Binary Tree)**: - 这是一个更宽泛的概念,包括但不限于AVL、红黑、B等,这些的设计目的是在每次插入和删除后自动调整以保持的高度尽可能均衡。 - 它们都有自我修复的能力,即使在插入或删除操作后也能快速恢复平衡,避免极端情况下的性能退化。 - 不同的平衡二叉树在具体实现上有差异,如AVL是高度严格平衡的,而红黑则相对宽松一些,但总体上保证了O(log n)的操作时间。 3. **平衡二叉排序树(Balanced Binary Search Tree, BBST)**: - 这实际上是平衡二叉树二叉排序树的结合,它保持了二叉排序树的排序性,同时具有平衡二叉树的特性。 - 当插入或删除后,BBST会进行适当的旋转操作来维持平衡,确保查找、插入和删除始终能在O(log n)时间内完成。 相关问题: 1. 什么是BST的平衡性? 2. AVL和红黑是如何保持平衡的? 3. BBST在实际应用中的优缺点是什么?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值