平衡指的都是一个平衡操作,分别可针对左子树和右子树进行调整,调整完将两端的最顶点
分别连接根节点的左右两端。
当列表数字递增的时候,基本都是发生左旋转。
[0]
[1]
1
2,左树节点与右树节点相差不等于2,不需要旋转。
1
2
3 ,左树节点与右树节点相差2,root的后继作为root进行左旋转,左树做平衡,右树做平衡。
2
1 3
[2].
2
1 3
4 ,左树节点 比右子树个数相差不等于2,左树平衡,右树平衡。
[3].
2
1 3
4
5,左树节点与右树个数相差2,root的后继进行左旋转,
3
2 4
1 5,左树平衡,右树平衡。
[4].
3
2 4
1 5
6 ,左树节点与右树个数相差不等于2,不发生旋转,左树平衡,右树平衡。
3
2 5
1 4 6 ,平衡后的结果。
[5].
3
2 5
1 4 6
7,左树节点与右边个数相差等于2,找到root的后继作为root,相当于发生旋转。
4
3 5
2 6
1 7,左树平衡,右树平衡。
4
2 6
1 3 5 7,平衡后的结果。
[6].
4
2 6
1 3 5 7
8 ,左树节点与右边个数相差不等于2,不发送旋转。
[7].
4
2 6
1 3 5 7
8
9,左树节点与右边个数相差等于2,找到root的后继5,发生旋转
5
4 6
2 7
1 3 8
9,左树平衡,右树平衡
5
4 7
2 6 8
1 3 9,平衡后的结果
5
3 7
2 4 6 8
1 9,平衡后的结果
[8].
5
3 7
2 4 6 8
1 9,节点数相差不等于2,不发生旋转,两边做平衡处理。
10
5
3 7
2 4 6 9
1 8 10,平衡后的结果
[9].
5
3 7
2 4 6 9
1 8 10
11 ,节点数相差2,取root的后继。
6
5 7
3 9
2 4 8 10
1 11,两边做平衡处理。
6
4 7
3 5 9
2 8 10
1 11,左边平衡 第一次
6
4 7
2 5 9
1 3 8 10
11,左边平衡 第二次
6
4 8
2 5 7 9
1 3 10
11,右边平衡 第1次
6
4 8
2 5 7 10
1 3 9 11,右边平衡 第2次
[10].
6
4 8
2 5 7 10
1 3 9 11
12,节点数相差不等于2,不发生旋转。
[11].
6
4 8
2 5 7 10
1 3 9 11
12
13,节点数相差==2,root的后继7作为root
7
6 8
4 10
2 5 9 11
1 3 12
13, 开始两边的平衡操作。
7
5 8
4 6 10
2 9 11
1 3 12
13, 左边平衡 第一次
7
5 8
3 6 10
2 4 9 11
1 12
13, 左边平衡 第2次
7
5 9
3 6 8 10
2 4 11
1 12
13, 右边平衡 第1次
7
5 9
3 6 8 11
2 4 10 12
1 13, 右边平衡 第2次
找出其中的规律,左右子树节点数相差是否等于2,等于2就发生旋转,然后分别对左右子树做平衡操作。
接下来就是使用代码实现的问题了。