二叉平衡樹:
平衡二叉搜索樹(Self-balancing binary search tree)又被稱為AVL樹(有別於AVL算法),且具有以下性質:它是一 棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。平衡二叉樹的常用實現方法有紅黑樹、AVL、替罪羊樹、Treap、伸展樹等。 最小二叉平衡樹的節點總數的公式如下 F(n)=F(n-1)+F(n-2)+1 這個類似於一個遞歸的數列,可以參考Fibonacci(斐波那契)數列,1是根節點,F(n-1)是左子樹的節點數量,F(n-2)是右子樹的節點數量。
二叉平衡樹的左子結點和右子結點 相差不能超過1(可以是0 or 1)
左旋:
A
B
C
在這個樹中 c的結點高度為1 b的結點高度為2 a的結點高度為3
根據二叉平衡樹的定義 可以知道此時樹不平衡
如何把樹平衡:
當右結點高度大於左結點高度時
想要把樹平衡需要這樣:
B
A C
此時可以看到A旋轉到了下方
此為樹的左旋
更多的情況:
ROOT
A
D B
E C
ROOT的左結點高度為0 右結點高度為3
此時結點高度大於1
此時左旋后 樹應該是:
ROOT
B
A C
D E
旋轉前e結點一定比a結點要大 所以 旋轉后 a的右結點應該改為 b的左結點(e)
b結點放入a結點的位置 a結點成為b結點的左結點
右旋:
A
B
C
此時c結點高度為1 b為2 a為3 樹不平衡
若要平衡則需要右旋:
B
C A
更多的情況
ROOT
A
B D
C E
此時樹不平衡 若需平衡需要右旋
ROOT
B
C A
E D
幺蛾子:
ROOT
A
B D
E
左孩子大於有孩子時
此時 b的左孩子比右孩子高 此時先左旋b 在右旋a
ROOT
A
D B
C
右孩子大於左孩子時
此時 b的左孩子比右孩子高 此時先右旋b 在左旋a