数据结构小记【Python/C++版】——AVL树篇

一,基本概念

AVL树是一种结构平衡的BST树,被称为平衡二叉树。

AVL树的具体特点是,每一个节点的左子树和右子树的高度差的绝对值最多为1,且其左子树和右子树也是AVL树。

BST树有时候会退化为一个链表,但是AVL树不会,因为AVL树具有自平衡属性。

AVL的自平衡是基于平衡因子来维持,平衡因子就是BST树中每个节点的左子树和右子树的高度差。因此对于AVL树来说,平衡因子的值应始终为 -1、0 或 +1。

如果平衡因子为1,则左子树比右子树深一级。

如果平衡因子为0,则左右子树处于相同的深度。

如果平衡因子为-1,则左子树比右子树浅一级。

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

二,AVL树的基本操作

插入节点和删除节点的操作,请参考前面写过的BST树的基本操作。

此处主要讲AVL树的再平衡问题,因AVL树是否平衡是基于平衡因子来衡量的,而插入节点和删除节点的操作容易打破AVL树原有的平衡,使平衡因子的绝对值大于1。此时的AVL树变成了不平衡的BST树,为了让BST树再次平衡成为AVL树,需要进行一系列的操作来改变树的结构,这个操作被称为旋转

当整个AVL树失去平衡时,仅需要对最小不平衡子树进行旋转即可。

旋转操作的本质是子节点和根节点位置的互换

1.左旋

1.发现一个子树的平衡因子为-2,定为最小不平衡子树。

2.找到破坏平衡的节点,即最小不平衡子树的根节点。

3.左旋最小不平衡子树,使破坏平衡的节点成为子树的左子节点。

2.右旋

1.发现一个子树的平衡因子为2,定为最小不平衡子树

2.找到破坏平衡的节点,即最小不平衡子树的根节点。

3.右旋最小不平衡子树,使破坏平衡的节点成为子树的右子节点。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员与背包客_CoderZ

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值