平衡二叉树是指左右子树的深度差不超过1的二叉树,通常用来优化二叉排序树。
平衡二叉树在构建过程和结点插入过程中遵守这样的法则:
1,如果想向某树的左子树的左子树插入结点导致失衡,那么如何平衡这棵树?
首先,这样一棵树肯定符合下图:
(1)
N是新结点,插入N到1的左子树的左子树中导致失衡。 一个很显见的办法就是令结点2作为树根重新生成该树。
显然,1,3由于比2大,则1,3是2的右子树
4,N由于比2小,则4,N在2的左子树。但是这样一来,5怎么办? 5也很好办,5比2大但是比1小,于是5应该在2的右子树中,但是由于比1小,因此5插入到1的左子树里,正好1的左子树也空了(以前是2啊)。
(2)
2,如果是某棵子树的右子树的右子树呢?
(3)
这也好办,明显3变成树根,1,2比3都小,于是都在3的左子树,5,N比3都大,在3的右子树,问题还是一个,4怎么办?4比3小比1大,于是4在1的右子树,正好1的右子树也空着。
(4)
3,如果是树根的左子树的右子树呢?
(5)
如果依然让2做新根,那么1,3比2大,在右子树,4比2小,在左子树,那么5和n怎么办?5比2大比1小,挂在1的左子树可以,如果5再挂N,必然不平衡。
(6)
于是只能让5的树根作为新根,再看(5)图,由于1,3比5的树根大,于是作为5的新右子树,2,4比5的树根小,于是做5的新左子树。问题现在为:树根5原来的子树怎么办?
原来的左子树比5的树根小,但是比2大,因此作为2的右子树。原来的右子树比5的树根大但是比1小,作为1的左子树。新结点相应插在5的两个子树的对应位置。
(7)
最后一个:
右子树的左子树,跟上差不多,对应着来就行了