数据结构与算法 -- 平衡二叉树的构建
前言
上一篇学习了一些常见的静态查找和动态查找中二叉搜索树的查找,插入和删除操作。在构建一个二叉搜索树的时候,假如给定的数据是一直递增的,那么就会一直存储在右子树上,构成一个斜树。这时在对其做查找时,效率一样很低。
那么在构建二叉搜索树的时候,怎么解决这样问题呢?接下来我们介绍一下利用平衡二叉树解决二叉搜索树失衡的问题。
1. 平衡二叉树构建分析
平衡二叉树:是一种二叉排序树,其中每一个结点的左右子树的高度差至多等于1。平衡二叉树又称为AVL树。
高度平衡:要么是一个空树,要么左右子树都是平衡二叉树。且左子树和右子树的深度差绝对值不超过1;我们将二叉树上左子树的深度减去右子树的深度的值称为平衡因子BF
最小不平衡子树:距离插入点最近的,且平衡因子的绝对值大于1的结点为根的子树,我们称为最小不平衡子树。
如上图中,当插入新节点37
时,就会打乱原有的平衡,图中圈出来的就是最小不平衡子树。
平衡二叉树构建的基本思想:在构建二叉排序树的过程中,每当插入新结点是,先检查是否因插入而破坏了树的平衡性,若是,则找到最小不平衡子树,在保证二叉排序树特性的前提下,调整最小不平衡子树中各节点之间的链接关系,进行左旋或者右旋,使之成为最新的平衡子树。
接下来,我们举个例子分析一下:
假设数组a[10] = {3,2,1,4,5,6,7,10,9,8}
。
在构建正常的二叉排序树,如下:
显然是失衡的,不能构成平衡二叉树。
接下来,我们来模拟一下平衡二叉树:
- 首先插入
结点 3,2,1
的过程。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LMz4zGHC-1590137686477)(https://user-gold-cdn.xitu.io/2020/5/22/1723a3da69fa1dbc?w=761&h=356&f=png&s=22368)]
当依次插入结点3、2、1
后,结点3
的平衡因子是2
,进行右旋。
- 插入
结点 4
插入结点4
后,没有失衡
- 插入
结点 5
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0au4hsI3-1590137686492)(https://user-gold-cdn.xitu.io/2020/5/22/1723a53e8c4c4296?w=867&h=408&f=png&s=28139)]
当插入结点5
时,结点3
的平衡因子为-2
,成为最小不平衡子树,进行左旋。
- 插入
结点 6
当插入结点6
时,结点2
的平衡因子为-2
,成为最小不平衡子树,进行左旋。
- 插入
结点7
结点5
的平衡因子为-2
,成为最小不平衡子树,进行左旋。
- 插入
结点10
插入后没有破坏原来的平衡
- 插入
结点9
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oR5oJgVb-1590137686503)(https://user-gold-cdn.xitu.io/2020/5/22/1723a5a4ca9c683d?w=532&h=372&f=png&s=46088)]
结点7
的平衡因子<