平衡二叉树旋转的结果不是唯一的,具体见下面分析:
插入序列:12, 4, 1, 7, 8, 10, 9, 2, 11, 6, 5
1、先插入12成为根
2、插入4在12的左子树,没有旋转
3、插入1在4的左子树,以4为中心向右单旋转,结果如下:
4
/ \
1 12
4、插入7在12的左子树,没有旋转
5、插入8在7的右子树,以8开始先左后右双旋转,结果如下:
4
/ \
1 8
/ \
7 12
6、插入10在12左子树,以8为中心开始向左单旋转,结果如下:
8
/ \
4 12
/ \ /
1 7 10
7、插入9在10 的左子树,以10为中心向右单旋转,结果如下:
8
/ \
4 10
/ \ / \
1 7 9 12
8、插入2在1的右子树,没有旋转
9、插入11在12 的左子树,没有旋转
10、插入6在7的左子树,没有旋转
11、插入5在6的左子树,以6为中心向右单旋转,结果如下:
8
/ \
4 10
/ \ / \
1 6 9 12
\ / \ /
2 5 7 11
平衡二叉树(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)是右子树的节点数量。
插入序列:12, 4, 1, 7, 8, 10, 9, 2, 11, 6, 5
1、先插入12成为根
2、插入4在12的左子树,没有旋转
3、插入1在4的左子树,以4为中心向右单旋转,结果如下:
4
/ \
1 12
4、插入7在12的左子树,没有旋转
5、插入8在7的右子树,以8开始先左后右双旋转,结果如下:
4
/ \
1 8
/ \
7 12
6、插入10在12左子树,以8为中心开始向左单旋转,结果如下:
8
/ \
4 12
/ \ /
1 7 10
7、插入9在10 的左子树,以10为中心向右单旋转,结果如下:
8
/ \
4 10
/ \ / \
1 7 9 12
8、插入2在1的右子树,没有旋转
9、插入11在12 的左子树,没有旋转
10、插入6在7的左子树,没有旋转
11、插入5在6的左子树,以6为中心向右单旋转,结果如下:
8
/ \
4 10
/ \ / \
1 6 9 12
\ / \ /
2 5 7 11