1
1
package ca .mcmaster .chapter .three .bitree ;
2
2
3
3
public class BalancedBinaryTree <V extends Comparable <V >> {
4
+ private AVLNode root ;
4
5
private class AVLNode {
5
6
V v ;
6
7
int height ; //当前节点的子树的高度
@@ -19,24 +20,136 @@ public AVLNode(V v) {
19
20
}
20
21
}
21
22
private int height (AVLNode n ){
23
+ if (n == null ) return -1 ;
22
24
return n .height ;
23
25
}
24
26
25
- private AVLNode singleRotateLeft (AVLNode n ){
27
+ /**
28
+ * @Description: LL插入造成不平衡,通过单次向右旋转重新平衡树。
29
+ * @param n
30
+ * @return
31
+ */
32
+ private AVLNode singleRotateRight (AVLNode n ){
26
33
AVLNode left1 = n .left ;
27
34
n .left = left1 .right ;
28
35
left1 .right = n ;
29
- left1 .height = Math .max (left1 .left . height , left1 .right . height ) + 1 ;
30
- n .height = Math .max (n .left . height , n . right .height ) + 1 ;
36
+ n .height = Math .max (height ( n .left ), height ( n .right ) ) + 1 ;
37
+ left1 .height = Math .max (height ( left1 .left ) , n .height ) + 1 ;
31
38
return left1 ;
32
39
}
33
40
34
- private AVLNode singleRotateRight (AVLNode n ){
41
+ /**
42
+ * @Description: RR插入造成不平衡,通过单次向左旋转重新平衡树。
43
+ * @param n
44
+ * @return
45
+ */
46
+ private AVLNode singleRotateLeft (AVLNode n ){
35
47
AVLNode right1 = n .right ;
36
- n .left = right1 .left ;
48
+ n .right = right1 .left ;
37
49
right1 .left = n ;
38
- right1 .height = Math .max (right1 .left . height , right1 .right . height ) + 1 ;
39
- n .height = Math .max (n .left . height , n .right . height ) + 1 ;
50
+ n .height = Math .max (height ( n .left ), height ( n .right ) ) + 1 ;
51
+ right1 .height = Math .max (n .height , height ( right1 .right ) ) + 1 ;
40
52
return right1 ;
41
53
}
54
+
55
+ /**
56
+ * @Description: LR造成的不平衡,需要两次旋转。
57
+ * @param n
58
+ * @return
59
+ */
60
+ private AVLNode doubleRotateLR (AVLNode n ){
61
+ n .left = singleRotateLeft (n .left );
62
+ return singleRotateRight (n );
63
+ }
64
+
65
+ /**
66
+ * @Description: RL造成的不平衡,两次旋转。
67
+ * @param n
68
+ * @return
69
+ */
70
+ private AVLNode doubleRotateRL (AVLNode n ){
71
+ n .right = singleRotateRight (n .right );
72
+ return singleRotateLeft (n );
73
+ }
74
+
75
+ public void insert (V v ){
76
+ if (null == v ){
77
+ throw new RuntimeException ("Cannot insert null to AVLTree" );
78
+ }
79
+ root = insert (v , root );
80
+ }
81
+
82
+ /**
83
+ * @Description: 向AVLTree中加入元素。
84
+ * @param v
85
+ */
86
+ private AVLNode insert (V v , AVLNode node ){
87
+ //当前节点已经为空,新建结点。
88
+ if (null == node ){
89
+ node = new AVLNode (v );
90
+ }else if (v .compareTo (node .v ) < 0 ) {
91
+ //L
92
+ node .left = insert (v , node .left );
93
+ //如果造成了不平衡
94
+ if (height (node .left ) - height (node .right ) == 2 ){
95
+ //判断是LL还是LR
96
+ if (v .compareTo (node .left .v ) < 0 ){
97
+ //LL
98
+ node = singleRotateRight (node );
99
+ }else {
100
+ //LR
101
+ node = doubleRotateLR (node );
102
+ }
103
+ }
104
+ }else if (v .compareTo (node .v ) > 0 ){
105
+ //R
106
+ node .right = insert (v , node .right );
107
+ //判断是否需要旋转
108
+ if (height (node .right ) - height (node .left ) == 2 ){
109
+ //判断LR/RR
110
+ if (v .compareTo (node .right .v ) > 0 ){
111
+ //RR
112
+ node = singleRotateLeft (node );
113
+ }else {
114
+ //RL
115
+ node = doubleRotateRL (node );
116
+ }
117
+ }
118
+ }else {
119
+ //如果要插入的数据和当前遍历到数据一致,do nothing
120
+ ;
121
+ }
122
+
123
+ node .height = Math .max (height (node .left ), height (node .right )) + 1 ;
124
+ return node ;
125
+ }
126
+
127
+ public static void main (String [] args ) {
128
+ BalancedBinaryTree <Integer > avlTree = new BalancedBinaryTree <>();
129
+ avlTree .insert (5 );
130
+ System .out .println ("insert :" + 5 );
131
+ System .out .println (avlTree .root .v );
132
+ System .out .println (avlTree .height (avlTree .root ));
133
+ System .out .println ("-------------------------------------" );
134
+ avlTree .insert (3 );
135
+ System .out .println ("insert :" + 3 );
136
+ System .out .println (avlTree .root .v );
137
+ System .out .println (avlTree .height (avlTree .root ));
138
+ System .out .println ("-------------------------------------" );
139
+ avlTree .insert (4 );
140
+ System .out .println ("insert :" + 4 );
141
+ System .out .println (avlTree .root .v );
142
+ System .out .println (avlTree .height (avlTree .root ));
143
+ System .out .println ("-------------------------------------" );
144
+ avlTree .insert (6 );
145
+ System .out .println ("insert :" + 6 );
146
+ System .out .println (avlTree .root .v );
147
+ System .out .println (avlTree .height (avlTree .root ));
148
+ System .out .println ("-------------------------------------" );
149
+ avlTree .insert (7 );
150
+ System .out .println ("insert :" + 7 );
151
+ System .out .println (avlTree .root .v );
152
+ System .out .println (avlTree .height (avlTree .root ));
153
+ System .out .println ("-------------------------------------" );
154
+ }
42
155
}
0 commit comments