二叉平衡树:
平衡二叉搜索树(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