数据结构——再赏“树“,关于搜索二叉树(BST树)和平衡二叉树(AVL树)那点事儿~(2)

简介: 数据结构——再赏“树“,关于搜索二叉树(BST树)和平衡二叉树(AVL树)那点事儿~(2)

二叉平衡树(AVL树)


什么是平衡二叉树


前戏~


树的高度


树的深度(Depth):树中所有结点中的最大层次是这棵树的深度或者高度


平衡因子


平衡因子(Balance Factor,简称BF): BF(T) = hL-hR,

其中hL和hR分别为T的左、右子树的高度


平衡二叉树


平衡二叉树(Balanced Binary Tree)(AVL树),平衡二叉树中不存在平衡因子大于 1 的节点,即|BF(T) |≤ 1。在一棵平衡二叉树中,节点的平衡因子只能取 0 、1 或者 -1 ,分别对应着左右子树等高,左子树比较高,右子树比较高。


注意:平衡二叉树也是一棵搜索树,所以搜索呀,删除呀等操作,对它一样是适用的,只是插入以后,可能会破坏平衡因子,所以待会要单独讲解平衡二叉树插入以后的调整问题,让树仍然保持是棵查找树

微信图片_20221017164503.jpg

平衡二叉树的性质


给定结点数为 n的AVL树的最大高度为O(log2n)


平衡二叉树的作用


可能有小伙伴读完什么树高、平衡因子,吧啦吧啦又来了一串定义、要求、性质,头已经大了微信图片_20221017164510.jpg

微信图片_20221017164626.jpg

平衡二叉树的调整(难点)


右单旋


形象化例子:将Mar 、 May 、 Nov依次插入

微信图片_20221017164727.jpg

不平衡的发现者是Mar,麻烦结点Nov 在发现者右子树的右边,因而叫 RR 插入,需要RR 旋转(右单旋)

右单旋原理图如下:微信图片_20221017164733.jpg

右单旋理解


小伙伴们看着原理图。现在可以把这棵树想象得很柔软,然后你握住了平衡因子处于中间地位的B结点,闭上双眼,使劲摇动它,在重力的作用下,发现者B结点变成了新的根。由搜索二叉树的性质告诉我们,在原来的树中,B结点是大于A结点的,于是现在新树中A结点成为了B结点的左子树,BL因为比B结点小但是又比A结点大,所以挂在了A的右子树上。


左单旋


形象化例子:将Aug 和 Apr插入到原本的平衡二叉树中

微信图片_20221017164738.jpg

不平衡的发现者是Mar,麻烦结点Apr在发现者左子树的左边,因而叫 LL 插入,需要LL 旋转(左单旋)

左单旋原理图如下:

微信图片_20221017164743.jpg

左单旋理解


咱们继续看着原理图。现在可以把这棵树想象得很柔软,然后你握住了平衡因子处于中间地位的B,闭上双眼,使劲摇动它,在重力的作用下,发现者B变成了新的根。二叉查找树的性质告诉我们,在原来的树中,B是小于A的,于是新树中,A变成了B的右子树,BL因为还是比B小,依旧挂在B的左子树,BR了,也是根据二叉查找树的性质,它只能到现在A的左子树挂着了。


左右双旋


形象化例子:将Jan插入到Mar的左子树上

微信图片_20221017164930.jpg

不平衡的发现者是May,麻烦结点Jan在左子树的右边,

因而叫 LR 插入,需要LR 旋转(左右单旋)

左右双旋原理图如下:微信图片_20221017164933.jpg

左右双旋理解


重点关注那三个结点,只要它们三平衡了,根据二叉搜索树的性质,其他点也可以相应调整平衡了。咱们继续看着原理图。现在子树C,对应上图的Mar。现在确实有一项插入进来了,无论它在插入到C的左子树还是C的右子树,它都来破坏平衡了。于是,我们可以将现在的树看作四棵子树由3个结点连接。为了重新平衡,我们可以看到不能让A再做根了,唯一的选择就是把平衡因子的大小是中间值C作为新的根结点,再结合二叉查找树的性质,迫使B做C的左儿子,A左C的右儿子,从而完全确定整棵树的最终位置。


右左双旋


形象化例子:将Fer插入到原本平衡的Dec的上面

微信图片_20221017164937.jpg

 

不平衡的发现者是Aug,麻烦结点Feb在右子树的左边,

因而叫 RL 插入,需要RL 旋转

右左双旋原理图:

微信图片_20221017164944.jpg


左右双旋理解


因为和上文的左右双旋类似,相信大家也理解啦。所以这里不在赘述啦~


总结


到这里为止,平衡二叉树为了调整插入而带来的不平衡的四种四种方式已经讲完啦~

数起来是四种,实际就是一种,有没有发现了。左单旋、右单旋要关注的核心结点是被破坏以后衡因子居中的结点微信图片_20221017164956.jpg

对于左右双旋和右左双旋也是类似的,我上文着重说,注意那三个结点,咱们要去处理它们三个中平衡因子居中的那个结点。其实也可以做这种想,小学集合站队的时候,中等高度的小盆友出来出来站好了,其他的位置就可以类推了,这里就是取平衡因子居中的点为标杆。

相关文章
|
1月前
|
算法
数据结构之博弈树搜索(深度优先搜索)
本文介绍了使用深度优先搜索(DFS)算法在二叉树中执行遍历及构建链表的过程。首先定义了二叉树节点`TreeNode`和链表节点`ListNode`的结构体。通过递归函数`dfs`实现了二叉树的深度优先遍历,按预序(根、左、右)输出节点值。接着,通过`buildLinkedList`函数根据DFS遍历的顺序构建了一个单链表,展示了如何将树结构转换为线性结构。最后,讨论了此算法的优点,如实现简单和内存效率高,同时也指出了潜在的内存管理问题,并分析了算法的时间复杂度。
52 0
|
27天前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
53 5
|
1月前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
87 16
|
1月前
|
算法
数据结构之文件系统模拟(树数据结构)
本文介绍了文件系统模拟及其核心概念,包括树状数据结构、节点结构、文件系统类和相关操作。通过构建虚拟环境,模拟文件的创建、删除、移动、搜索等操作,展示了文件系统的基本功能和性能。代码示例演示了这些操作的具体实现,包括文件和目录的创建、移动和删除。文章还讨论了该算法的优势和局限性,如灵活性高但节点移除效率低等问题。
53 0
|
2月前
|
存储 算法 关系型数据库
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
32 0
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
|
2月前
|
存储 算法 数据管理
数据结构与算法学习二零:二叉排序树(BST)、平衡二叉树(AVL)
这篇文章通过需求分析、代码实现和测试验证,详细介绍了二叉排序树的创建、遍历和删除操作,以及二叉平衡树(AVL)的自平衡特性和单旋转操作,旨在提高树结构在数据管理中的效率和性能。
53 0
数据结构与算法学习二零:二叉排序树(BST)、平衡二叉树(AVL)
|
2月前
|
Java C++
【数据结构】探索红黑树的奥秘:自平衡原理图解及与二叉查找树的比较
本文深入解析红黑树的自平衡原理,介绍其五大原则,并通过图解和代码示例展示其内部机制。同时,对比红黑树与二叉查找树的性能差异,帮助读者更好地理解这两种数据结构的特点和应用场景。
40 0
|
1月前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
205 9
|
1月前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
35 1