引入平衡树
假设我们有两个节点:当我们插入第三个节点,就失衡了:此刻我们就要把它平衡一下。
为什么要变平衡
为什么说它失衡了呢,又为什么要把它变平衡?
如图a,假设我们要查找30这个节点就要查3次才能找到
但是如果平衡之后(图b)就只需要2次就可以找到了,这样可以提高效率,这两个图不够明显,如果是100个节点的图就够明显了。
怎么变平衡
首先,假如有这样一个二叉搜索树:
LL型失衡
我们应该怎么平衡呢?
首先,因为根节点最小,所以把根节点变到2的右边,这也符合二叉搜索的特性,即:小了往左走
这个时候20就成了新的根节点,而原先的根节点10就成了现在根节点(20)的左孩子节点。
因此对于这种一边倒的二叉搜索树,并且是向左倒的:
对于LL型失衡,我们可以有如下变平衡方法:
RR型失衡
同理,有往左边倒的就有往右边倒的,如下图:
因为40比30大的缘故,我们可以让40到30的右边去,这样就平衡了,并且符合二叉搜索树的特性,即:大了就往右边走:
此时30就是新节点,40就为30的右孩子。
这种往右边一边倒的失衡,我们称之为RR型失衡。
对此,我们可以有如下平衡方法:
新根节点为原根节点的左孩子,原先的根节点变为新根节点的有孩子。
LR型失衡
因为root节点的左孩子的右节点造成的失衡就叫LR型失衡
对于这种我们还可以套用
变为这个样子:
RL型失衡
有这样一棵树:这个时候是不是应该变成这个样子:即把原先的根节点变为新根的右孩子,至于排在右孩子的哪个位置就按二叉搜查树的性质走,大了就往右走,小了就往左走。