考研之数据结构018_平衡二叉树(AVL)

考试重点(选择题):
1.我们在二叉排序树中,插入一个新结点之后,怎么保证这棵树依然是“平衡二叉树”。
2.高为h的平衡二叉树,最少有几个结点——递推求解
在这里插入图片描述

一、定义

平衡二叉树,简称平衡树(AVL树): 树上任一结点的左子树和右子树的高度之差不超过1。
ps:AVL是平衡树 ——ASL是:平均查找长度 =》不要混淆。

结点的平衡因子某结点的左子树高-右子树高
二叉树是平衡的话,各个结点的平衡银子只能是:“-1,0,1”。
例如:如下图,50根节点,左子树高度是2,而右子树高度为3.所以:结点的平衡银子=左子树2-右子树3=-1
在这里插入图片描述
让一颗二叉排序树保持平衡,就可以保证查找效率:log2n

在这里插入图片描述

二、插入操作

在我们插入一个新结点后,如何保持二叉树的平衡?
方法:我们可以从新插入的结点开始往上找,找到第一个不平衡的结点,进行调整以该结点为根的子树——最小不平衡子树。
最小不平衡子树:最小的结点的左右子树高度相差大于1

在这里插入图片描述

三、插入后调整“不平衡”问题

在插入操作中,只要将最小不平衡树调整平衡,则其他祖先结点都会恢复平衡。
二叉排序树的特性:
左子树结点值< 根节点的值 < 右子树结点的值
目标:
1.插入新结点后,恢复平衡
2.保持二叉排序树的特性。

在这里插入图片描述

1.LL左孩子左子树平衡旋转(右单旋转)

由于结点A的左孩子(L)的左子树(L)上插入了新结点,A的平衡因子从1增2,导致A为根的子树失去平衡,需要一次向右的旋转操作:
将A的左孩子B向右上旋转代替A称为根节点,将A结点向右下旋转称为B的右子树的根节点,而B的原右子树则作为A结点的左子树

自己简述:
在调整LL最小不平衡子树中,让目前根的左子树B结点成为根节点,并让左子树的右子树BR,成为原根A结点的左子树。(原根节点A,之前左子树是B,现在A成了根节点B的右子树了)

在这里插入图片描述

1.LL代码:

f是指向原根节点
P指向根节点的左子树



f->lchild=p->rchild;
B的右子树,成为A结点的左子树。 
下一步是为了,让A结点成为B结点的右子树

p->rchild=f
A结点变成B的右孩子。
是因为F存放的是原根节点A的地址,现在将F的值赋值给B的右孩子了。
也就是说B的右孩子是A

gf->lchild/rchild=p
A的父结点原本指向A的孩子指针,指向P(也就是B)
也就是将根节点的上一结点指向根节点。
。从而B成了根节点

在这里插入图片描述

2.RR右孩子右子树平衡旋转(左单旋转)

RR 平衡旋转(左单旋转)。由于结点A的右孩子(R)的右子树(R)上插入了新结点,高度有-1变-2了,导致了A为根的子树失去了平衡,需要一次向左的旋转操作。将A根节点的右孩子B向左上旋转,代替A称为根节点。将A向左下旋转成为B的左孩子,将之前B的左子树,变成A的右子树
自己叙述:
在调整RR最小不平衡子树中,让目前根节点A的右子树成为根节点,现在B成为了根节点。再让B的右子树的左子树,成为现在根节点的左子树A结点的右子树。

在这里插入图片描述

1.RR代码:

不平衡之前
A是:根节点
B是:根节点A的右孩子

变平衡:
将B的左孩子变为A的右孩子,让A结点变成B的左孩子,在修改A的父结点指针,指向B结点。
(是因为根节点之前是A ,现在根节点是B。让父结点从A变成B)

平衡之后
B是:根节点
A是:根节点B的左孩子

在这里插入图片描述

3.LR左孩子右子树平衡旋转( 旋转)

在这里插入图片描述

在这里插入图片描述

C结点就是  根节点的左子树的右孩子

先让C结点左旋转,顶替B的位置,
再让C结点在进行一个右上旋转。
替换A的位置。
---------------

首先是C左旋替换B的位置,然后B变成C的左孩子。
然后是C右旋替换A的位置,然后C的右孩子变成A的左孩子。
从而:A变成C的右孩子

4.RL右孩子的左子树平衡旋转(旋转)

在这里插入图片描述

先让C结点,右旋转顶替B,在左旋顶替A
--
右旋顶替B:
C的右孩子,成为B的左孩子。
C的右子树,成为B

左旋顶替A:
先让C的左子树,成为A的右子树。
再让C的左子树,成为A

5.练习:调整完以后,一定验算是否符合左中右依次递增。

1.

在这里插入图片描述

2.

在这里插入图片描述
在这里插入图片描述

3.

将60结点的左子树,交给他的父结点的右子树。
将60结点的右子树,交给他的爷结点的左子树。

在这里插入图片描述
在这里插入图片描述

四、查找效率分析

假设nh表示深度为h的平衡树中含有的最少结点数。

在这里插入图片描述
n1= 1
n2= 1+n1= =2
n3= n2+n1+1 =4
n4= n3+n2+1 =7
n5= n4+n3+1 = 7+4+1=12
在这里插入图片描述
平均查找长度(查找的时间复杂度)和树高是同一个数量级。
在这里插入图片描述

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

BigTree的学习之路

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值