【开卷数据结构 】平衡二叉树(AVL)

简介: 【开卷数据结构 】平衡二叉树(AVL)

平衡二叉树的定义


Q:什么是二叉排序树


A:二叉排序树或者是一棵空树,或者是具有如下性质的二叉树


1)若它的左子树不空,则 左子树 上所有结点的值 均小于 它的根结点的值

2)若它的右子树不空,则 右子树 上所有结点的值 均大于 它的根结点的值

3)左、右子树也分别是一棵二叉排序树

Q:什么是平衡二叉树


A:它或者是一颗空树,或者是具有以下性质的二叉排序树:它的左子树和右子树的深度之差的绝对值不超过1,且它的左子树和右子树都是一颗平衡二叉树。


定义结点左子树与右子树的高度差为该结点的平衡因子,则平衡二叉树结点的平衡因子只可能是 -1,0,1。

77f640a08d8defe41cefa0f6e899b4a3_f60f837361ca4e418c52cf968b27c38f.png


平衡二叉树的插入


每当在二叉排序树中插入(或删除)一个结点时,首先要检查其插入路径上的结点是否因为此次操作而导致了不平衡。若导致了不平衡,则先找到路径上离插入结点最近的平衡因子的绝对值大于1的结点 A,再对以 A 为根的子树,在保持排序树特性的前提下,调整各结点的位置关系,使之重新达到平衡。


平衡二叉树的插入过程的前半部分与二叉排序树相同,但在新结点插入后,若造成查找路上的某个结点不再平衡,则需要做出相应的调整。可将调整的规律归纳为下列4种情况:


LL平衡旋转(右单旋转)


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

faea36e45a076dd4b47f1df94e4d45b7_c8f141a93aac421086ea53b54b431f44.png


RR平衡旋转(左单旋转)


由于在结点 A 的右孩子(R)的右子树(R)上插入了新结点,A 的平衡因子由 −1 减至 −2,导致以 A 为根的子树失去平衡,需要一次向左的旋转操作。将 A 的右孩子 B 向左上旋转代替 A 成为根结点,将 A 结点向左下旋转成为 B 的左子树的根结点,而 B 的原左子树则作为 A 结点的右子树的。

f812c700f5226a196572c42aa7c27794_b9bde9610920491f8228f7758d39c8bd.png


LR平衡旋转(先左后右双旋转)


在 A 的左孩子(L)的右子树(R)上插入新结点,A 的平衡因子由1增至2,导致以 A 为根的子树失去平衡,需要进行两次旋转操作,先左旋转后右旋转。先将 A 结点的左孩子 B 的右子树的根结点 C 向左上旋转提升到 B 结点的位置,然后把该 C 结点向右上旋转提升到 A 结点的位置。

afd0d63e8b163e7908ee0d3275497b9b_1885f95d5c79443bbf0e77eb4bc5566f.png


RL平衡旋转(先右后左双旋转)


由于在 A 的右孩子(R)的左子树(L)上插入新结点,A 的平衡因子由 −1减至 −2,导致以 A 为根的子树失去平衡,需要进行两次旋转操作,先右旋转后左旋转。先将 A 结点的右孩子 B 的左子树的根结点 C 向右上旋转提升到 B 结点的位置,然后把该 C 结点向左上旋转提升到 A 结点的位置。

fcef6297cdc3a2f6d3322d26e6e8125d_c5df5ffe67c140e8a46177ac8a111b21.png


平衡二叉树的构建


假设关键字序列为{6,1,2,5,4,3},通过该序列生成二叉排序树的过程如下:


第一步:创建一个空树


423e54f53c233ef466f06e8b9e8a7d9e_d36b8efca295416c87769b44736472fc.png


第二步:插入结点 6


7e73572f6a0db4ebe8281c38be6e85d7_77f5db582e4143c994c6c93ae1adea82.png


第三步:插入结点 1


555a104b5048bfdd1533bc78131f1da7_ad6bdc78e04641fb8d61d79ecc1d7561.png


第四步:插入结点 2


552a329b155e1a1567b1987c9f4b61e3_612d71908b594317a28e48e6bc78b69e.png


第五步:LR旋转


20b52b86245f1d44767c626ddb38f7bc_4f9acbb3d1af43038b3472f7344cba4e.png


第六步:插入结点 5


ab7dbc675090c80c5f0460a4381c00b1_b9aed395a67541989f96bd88b06d8eab.png


第七步:插入结点 4


5ce3de0e5c652834d673bc6357a0b0ac_e57c9dda0aea4c2ebfd60158170bc6db.png


第八步:LL旋转


c3b145d1db89cc426fd27e6ee48b1fe1_0212df195a8144fbaa531a374cea26db.png


第九步:插入结点 3


91f9a9221750f3d4e18e34f552a14738_ccaf7846c5cd46ef9bfbf8197197e079.png


第十步:RL旋转


80cd0bdc68f39bf3efb01bf3d53c3d37_3c4198d4c2a4417485a19c737b6be61a.png


平衡二叉树的查找


在平衡二叉树上进行查找的过程与二叉排序树的相同。因此,在查找过程中,与给定值进行比较的关键字个数不超过树的深度。假设以 nh,表示深度为 h 的平衡树中含有的最少结点数。显然,nh有 n0=0,n1=1,n2=2, 并且有 nh=nh−1+nh−2+1。 可以证明,含有 n 个结点的平衡二叉树的最大深度为 O(log2⁡n),因此平衡二叉树的平均查找长度为 O(log2⁡n)。


相关文章
|
2月前
|
存储 算法 数据管理
数据结构与算法学习二零:二叉排序树(BST)、平衡二叉树(AVL)
这篇文章通过需求分析、代码实现和测试验证,详细介绍了二叉排序树的创建、遍历和删除操作,以及二叉平衡树(AVL)的自平衡特性和单旋转操作,旨在提高树结构在数据管理中的效率和性能。
54 0
数据结构与算法学习二零:二叉排序树(BST)、平衡二叉树(AVL)
|
2月前
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解(三)
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解
|
2月前
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解(二)
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解
|
2月前
|
存储
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解(一)
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解
|
3月前
|
存储 C语言
数据结构基础详解(C语言): 树与二叉树的应用_哈夫曼树与哈夫曼曼编码_并查集_二叉排序树_平衡二叉树
本文详细介绍了树与二叉树的应用,涵盖哈夫曼树与哈夫曼编码、并查集以及二叉排序树等内容。首先讲解了哈夫曼树的构造方法及其在数据压缩中的应用;接着介绍了并查集的基本概念、存储结构及优化方法;随后探讨了二叉排序树的定义、查找、插入和删除操作;最后阐述了平衡二叉树的概念及其在保证树平衡状态下的插入和删除操作。通过本文,读者可以全面了解树与二叉树在实际问题中的应用技巧和优化策略。
|
4月前
|
C++ 容器
【数据结构】AVL树
【数据结构】AVL树
|
6月前
数据结构学习记录——平衡二叉树的调整(基本介绍、右单旋、左单旋、左右双旋、右左双旋、平衡因子的计算)
数据结构学习记录——平衡二叉树的调整(基本介绍、右单旋、左单旋、左右双旋、右左双旋、平衡因子的计算)
104 1
|
5月前
|
存储
【数据结构】AVL树——平衡二叉搜索树
【数据结构】AVL树——平衡二叉搜索树
|
6月前
数据结构篇:旋转操作在AVL树中的实现过程
数据结构篇:旋转操作在AVL树中的实现过程
47 0
|
7月前
|
存储 算法 C++
数据结构/C++:AVL树
数据结构/C++:AVL树
48 2

热门文章

最新文章