平衡二叉树

为什么要有平衡二叉树

我们前边学习了二叉搜索树,解决一组有序数据集合数据插入和删除困难的问题。但是也碰到了一个问题,就是如果这棵二叉搜索树长得太歪了怎么办。如下图所示,这跟链表有啥区别。如果树长成这样,二叉搜索树还有什么意义。
在这里插入图片描述

所以,为了世界的和平,为了正义,我们需要解决这个问题。于是平衡二叉树出现了。

平衡二叉树定义

平衡二叉树也叫AVL树,由两个算法创造者命名。
首先它得是一个二叉排序树,其中每一个节点得左子树和右子树的高度差至多等于1。

平衡二叉树相关概念

平衡因子(BF)

指定一个节点,用其左子树高度减去右子树高度得到的值就是该节点的平衡因子。
注意:读完概念,我们感觉很好理解,但是我们要记住平衡因子是相对节点而言的,每个节点都有自己的平衡因子。

最小不平衡子树

距离插入节点最近的,且平衡因子的绝对值大于1的节点为根的子树,我们称为最小不平衡子树。
其实这个概念。在我看了好多棵平衡二叉树构造过程后,感觉应该有个前提,在插入节点前,这棵树应该首先是平衡的。不然这个最小总让人感觉有点不完全正确。(这只是我的感觉,按照人家的定义,确实也是对的)。

构造不平衡树

终于到了讲解例子的时候了,看完这个例子,应该就可以了解简单的平衡二叉树。我们还是引用大话数据结构的平衡二叉树例子。数组a[10]={3,2,1,4,5,6,7,10,9,8}。

先是根3,然后2称为3的左孩子。此时3的平衡因子为1。此时树平衡。继续插入1,称为2的左孩子。此时3的平衡因子为2,如图1,以3为节点的子树为最小不平衡子树。平衡因子为正数,则顺时针旋转。旋转成符合二叉排序树规则的样子,如图2,树又恢复了平衡。此时插入4,节点的平衡因子跟着变化,但是-1的绝对值也不大于1,所以树平衡。
在这里插入图片描述
接着插入5,应该插到4节点的右孩子处。这个时候根节点2平衡因子变为-2,3节点平衡因子也为-2,此时就要根据定义确定最小不平衡树,距离插入节点最近的平衡因子大于1的,那就是下图中的3节点了。然后因为是负的,所以逆时针旋转最小平衡树,还是转成符合二叉排序树的。
在这里插入图片描述
接着插入6,发现根节点2,平衡因子为-2,此时逆时针旋转,发现4节点做了根,那么4节点的左孩子没地方放了。此时按照二叉排序树规则,把三重新插入一遍,于是就成了2节点的右孩子。
在这里插入图片描述
此时再插入7,发现5的平衡因子变成了-2,那么这个5为根的子树就成了最小不平衡子树。现在开始逆时针旋转,使整棵树达到平衡。
在这里插入图片描述
此时再插入10,发现树平衡。然后再插入9,发现以7为根节点的子树不平衡,逆时针旋转,发现不符合二叉排序树规则,10比9大,9不可以作为10的右子树。因此就需要对这棵子树做调整。我们发现原来需要调整的最小不平衡子树,都是一个方向排着,这样会导致一个结果,他们的平衡因子是一个符号的,而现在的节点7和节点10平衡因子符号相反。因此我们先将他们调整为一致的,我们把9和10进行顺时针旋转,和7的平衡因子符号一致。再整体左旋(逆时针),使树达到平衡。
在这里插入图片描述
接着插入8,此时6节点的平衡因子为-2,和刚才情况一样,平衡因子符号不一致,因此先右旋9子树,再左旋6子树,使树达到平衡。
在这里插入图片描述

发布了20 篇原创文章 · 获赞 1 · 访问量 327
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览