11package ca .mcmaster .chapter .three .bitree ;
22
33public class BalancedBinaryTree <V extends Comparable <V >> {
4+ private AVLNode root ;
45 private class AVLNode {
56 V v ;
67 int height ; //当前节点的子树的高度
@@ -19,24 +20,136 @@ public AVLNode(V v) {
1920 }
2021 }
2122 private int height (AVLNode n ){
23+ if (n == null ) return -1 ;
2224 return n .height ;
2325 }
2426
25- private AVLNode singleRotateLeft (AVLNode n ){
27+ /**
28+ * @Description: LL插入造成不平衡,通过单次向右旋转重新平衡树。
29+ * @param n
30+ * @return
31+ */
32+ private AVLNode singleRotateRight (AVLNode n ){
2633 AVLNode left1 = n .left ;
2734 n .left = left1 .right ;
2835 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 ;
3138 return left1 ;
3239 }
3340
34- private AVLNode singleRotateRight (AVLNode n ){
41+ /**
42+ * @Description: RR插入造成不平衡,通过单次向左旋转重新平衡树。
43+ * @param n
44+ * @return
45+ */
46+ private AVLNode singleRotateLeft (AVLNode n ){
3547 AVLNode right1 = n .right ;
36- n .left = right1 .left ;
48+ n .right = right1 .left ;
3749 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 ;
4052 return right1 ;
4153 }
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+ }
42155}
0 commit comments