该来的总会来,平衡二叉树果然又来了....
出现背景
前文已经研究过普通的二叉树,
为什么要用二叉树呢?因为二叉树的结构可以实现二分法查找的效果。
你比如前文介绍的满二叉树:如下图所示,
如果你想要查找4号元素,你只需要遍历3次即可。
所以在理想情况下,二叉树可以优化遍历。遍历时的时间复杂度基本上为0(logn)。但是考虑一种情况,在按顺序插入数据的情况下,二叉树会退化成链表结构
如下图所示:
此时,因为是按照一定顺序插入,所以最后形成的二叉树结构是呈一种线性的,相当于一个有序的链表。
此时如果遍历查询,在时间复杂度上和链表是等同的(0(n))。
那如何避免二叉树退化呢?首先考虑下不让二叉树退化是什么意思?也就是目的
不让二叉树退化是说即便是在顺序插入的情况下,也不能让其成为线性结构。这就是目的,也就是说避免二叉树在某些情况下成为线性链表
那么为了实现这个目的,应该如何做呢?尽量将其调整为满二叉树形式或者向满二叉树靠近,但是满二叉树对每层的节点个数都有固定要求,如果单纯的就是调整为满二叉树也不现实。
所以我们要将二叉树尽量调整为左右子树高度差最多不超过1的平衡二叉树。
这也就是平衡二叉树的作用了。
所以,接下来为了避免二叉树的退化,我们需要明白二叉树什么时候需要调整,要怎么调整。
也就是做两件事
when?何时调整?判断二叉树是不是平衡二叉树
how?如何调整?将非平衡的二叉树调整为平衡二叉树
识别平衡二叉树
既然要将不平衡的二叉树进行调整,那么什么样的树是平衡的?什么样的树是不平衡的?
一定要按照平衡二叉树的性质来区分判断: