0.简介
本次我来简单做一个平衡二叉树的推导,意在了解平衡二叉树的旋转方法是怎么来的,还有就是我记不住LL,RR这都是啥意思,所以决定找个好理解的方法,应该说是我能理解的方法。
1.平衡二叉树
平衡二叉树有个规则,首先是有序,然后就是一个节点的左右子树的高度差不能超过1。
也就是差是2以及以上就是不平衡了,因为平衡二叉树是时刻都在调整平衡,所以差顶多就是2了。来看一下不平衡的情况是什么。下面采用手绘图来表达。
上图中我们不难看出,这种情况是不平衡情况,相对的还可以是右子树深左子树浅,这里就只拿这一个方向做例子。
上图中,我将原本的1分解成了2和3两个图,就是图中的圈2和圈3,后面对于图序号不在重复说明。然后2图分解成4图,图3分解成图5。
接下来我们只看图4和图5,这里的分解就是将长方体里的节点拿出来一个给画成树的圆圈了,这样看起来更直观一些,你可能会好奇,为什么图4和图5的C节点下是一个m和m-1层数的,难道没有两个子树都是m层的情况吗?当然没有了 ,因为平衡二叉树在插入节点不平衡之前是平衡的,也就是说,是从两个子树都是m-1层变换到一个m层一个m-1层。所以是不可能出现C节点下两个子树都是m层。
解决了前面的疑问后,我们先看图4。导致数不平衡主要关注点就是图深色的两个子树。正是因为这两个子树造成的差值超过了1,所以树不符合平衡规则。对于图4来说,可以把A节点的右子树降低,来减少差值。
上图中,我们将A节点降低,所以先将A节点从树上拿下来,如图4-1,然后将B的右子树接到A节点的左边,为什么可以这么做?因为B的右子树的值全部都符合A左子树值的要求,所以B的右子树可以直接当做A的左子树,这里就不详细解释了。然后再将A接在B的右子树上,这里也很显然了,这样既能保证把A降低,同时还能让节点的大小关系正确。
但是有个问题?为什么不能从升高C节点的角度来考虑,因为C的两个子树对于都是C节点来说,都是满足平衡条件的,尝试一下就可以发现问题,如下图。
我们看图4-4和图4-5,在图4-5中C节点竟然没地方放了!所以我们才使用降低A节点。这里再深走一步,为什么降低A节点的时候,A是有地方放的?因为A从树上拿下来来时候,A左子树有了空位,将B的右子树接上之后,空位跑到了B的右子树位置,所以A有地方放。而4-5中,将C的左子树接在B上后,留下的空位还是C自身的右子树,空位出现在了自身下,C不能接在自己的右子树上。
接下来我们看一下在代码层面上如何换位置,其实在实际上,这种情况不必非要展开到图4,因为只和A,B节点相关,所以可以不用展开到C就能操作。
具体操作如上图所示。
2.备注
图5情况请看下一篇。