11package Trees ;
22
33import java .util .*;
4+ import static Trees .BTree .TreeNode ;
45
5- public class AVL {
6+ public class AVL < T extends Comparable < T >> extends BinarySearchTree < T > {
67
7- private class AVLNode {
8+ // heights of nodes are stored
9+ Map <TreeNode <T >, Integer > map ;
810
9- int val ;
10- int height ;
11- AVLNode left , right ;
12-
13- public AVLNode (int val ) {
14- this .val = val ;
15- this .height = 1 ;
16- }
11+ private TreeNode <T > root ;
1712
13+ public AVL () {
14+ map = new HashMap <>();
1815 }
19- private AVLNode root ;
2016
21- public void add (int val ) {
17+ @ Override
18+ public void add (T val ) {
2219 root = add (val , root );
2320 }
2421
25- private int getHeight (AVLNode node ) {
26- return node == null ? 0 : node . height ;
22+ private int getHeight (TreeNode node ) {
23+ return map . getOrDefault ( node , 0 ) ;
2724 }
2825
29- private int getBalanceFactor (AVLNode node ) {
26+ private int getBalanceFactor (TreeNode node ) {
3027 if (node == null ) {
3128 return 0 ;
3229 }
3330 return getHeight (node .left ) - getHeight (node .right );
3431 }
3532
36- private AVLNode add (int val , AVLNode root ) {
37- if (root == null ) {
38- return new AVLNode (val );
39- } else if (root .val > val ) {
40- root .left = add (val , root .left );
41- } else if (root .val < val ) {
42- root .right = add (val , root .right );
43- } else {
44- return root ;
45- }
46- return balance (root , val );
47- }
48-
49- public void remove (int val ) {
33+ @ Override
34+ public void remove (T val ) {
5035 root = delete (val , root );
5136 }
5237
53- private int getMin (AVLNode node ) {
38+ private T getMin (TreeNode < T > node ) {
5439 if (node .left == null ) {
5540 return node .val ;
5641 }
57- return getMin (node .left );
42+ return ( T ) getMin (node .left );
5843 }
5944
60- public int getMin () {
45+ @ Override
46+ public T getMin () {
6147 return getMin (root );
6248 }
6349
64- private AVLNode delete (int val , AVLNode node ) {
50+ private TreeNode < T > delete (T val , TreeNode < T > node ) {
6551 if (node == null ) {
6652 return null ;
6753 }
68- if (node .val > val ) {
54+ if (node .val . compareTo ( val ) > 0 ) {
6955 node .left = delete (val , node .left );
70- } else if (node .val < val ) {
56+ } else if (node .val . compareTo ( val ) < 0 ) {
7157 node .right = delete (val , node .right );
7258 } else {
7359 if (node .left == null && node .right != null ) {
7460 return node .right ;
7561 } else if (node .left != null && node .right == null ) {
7662 return node .left ;
7763 } else if (node .left != null && node .right != null ) {
78- int min = getMin (node .right );
64+ T min = ( T ) getMin (node .right );
7965 node .val = min ;
8066 node .right = delete (min , node .right );
8167 return node ;
@@ -86,61 +72,132 @@ private AVLNode delete(int val, AVLNode node) {
8672 return balance (node , val );
8773 }
8874
89- private AVLNode balance (AVLNode node , int val ) {
90- node .height = 1 + Math .max (getHeight (node .left ), getHeight (node .right ));
75+ private TreeNode <T > add (T val , TreeNode < T > root ) {
76+ if (root == null ) {
77+ TreeNode <T > temp = new TreeNode (val );
78+ map .put (temp , 1 );
79+ return temp ;
80+ } else if (root .compareTo (val ) > 0 ) {
81+ root .left = add (val , root .left );
82+ } else if (root .compareTo (val ) < 0 ) {
83+ root .right = add (val , root .right );
84+ } else {
85+ return root ;
86+ }
87+ return balance (root , val );
88+ }
89+
90+ private TreeNode <T > balance (TreeNode <T > node , T val ) {
91+ map .put (node , 1 + Math .max (getHeight (node .left ), getHeight (node .right )));
9192 int balanceFactor = getBalanceFactor (node );
9293 if (balanceFactor > 1 ) {
93- if (val < node .left . val ) {
94+ if (node .compareTo ( val ) > 0 ) {
9495 return rightRotate (node );
95- } else if (val > node .left . val ) {
96+ } else if (node .compareTo ( val ) < 0 ) {
9697 node .left = leftRotate (node .left );
9798 return rightRotate (node );
9899 }
99100 }
100101 if (balanceFactor < -1 ) {
101- if (val > node .right . val ) {
102+ if (node .compareTo ( val ) < 0 ) {
102103 return leftRotate (node );
103- } else if (val < node .right . val ) {
104+ } else if (node .compareTo ( val ) > 0 ) {
104105 node .right = rightRotate (node .right );
105106 return leftRotate (node );
106107 }
107108 }
108109 return node ;
109110 }
110111
111- private AVLNode leftRotate (AVLNode node ) {
112- AVLNode temp = node .right ;
113- AVLNode x = temp .left ;
112+ private TreeNode < T > leftRotate (TreeNode < T > node ) {
113+ TreeNode < T > temp = node .right ;
114+ TreeNode < T > x = temp .left ;
114115 temp .left = node ;
115116 node .right = x ;
116- temp . height = 1 + Math .max (getHeight (temp .left ), getHeight (temp .right ));
117- node . height = 1 + Math .max (getHeight (node .left ), getHeight (node .right ));
117+ map . put ( temp , 1 + Math .max (getHeight (temp .left ), getHeight (temp .right ) ));
118+ map . put ( node , 1 + Math .max (getHeight (node .left ), getHeight (node .right ) ));
118119 return temp ;
119120 }
120121
121- private AVLNode rightRotate (AVLNode node ) {
122- AVLNode temp = node .left ;
123- AVLNode y = temp .right ;
122+ private TreeNode < T > rightRotate (TreeNode < T > node ) {
123+ TreeNode < T > temp = node .left ;
124+ TreeNode < T > y = temp .right ;
124125 temp .right = node ;
125126 node .left = y ;
126- temp . height = 1 + Math .max (getHeight (temp .left ), getHeight (temp .right ));
127- node . height = 1 + Math .max (getHeight (node .left ), getHeight (node .right ));
127+ map . put ( temp , 1 + Math .max (getHeight (temp .left ), getHeight (temp .right ) ));
128+ map . put ( node , 1 + Math .max (getHeight (node .left ), getHeight (node .right ) ));
128129 return temp ;
129130 }
130131
131- public List <Object > inOrder () {
132- return inOrder (root );
132+ @ Override
133+ public boolean contains (T val ) {
134+ return contains (val , root );
133135 }
134136
135- private List < Object > inOrder ( AVLNode node ) {
137+ private boolean contains ( T val , TreeNode node ) {
136138 if (node == null ) {
137- return new ArrayList <>() ;
139+ return false ;
138140 }
139- List <Object > ans = new ArrayList <>();
140- ans .addAll (inOrder (node .left ));
141- ans .add (node .val );
142- ans .addAll (inOrder (node .right ));
143- return ans ;
141+ if (node .compareTo (val ) == 0 ) {
142+ return true ;
143+ }
144+ return contains (val , node .left ) || contains (val , node .right );
145+ }
146+
147+ @ Override
148+ public List <Object > inOrder () {
149+ return super .inOrder (root );
150+ }
151+
152+ @ Override
153+ public List <Object > preOrder () {
154+ return super .preOrder (root );
155+ }
156+
157+ @ Override
158+ public List <Object > postOrder () {
159+ return super .postOrder (root );
160+ }
161+
162+ @ Override
163+ public List <List <Object >> levelOrder () {
164+ return super .levelOrder (root );
165+ }
166+
167+ @ Override
168+ public List <Object > leftView () {
169+ return super .leftView (root );
170+ }
171+
172+ @ Override
173+ public List <Object > rightView () {
174+ return super .rightView (root );
175+ }
176+
177+ @ Override
178+ public List <Object > topView () {
179+ return super .topView (root );
180+ }
181+
182+ @ Override
183+ public List <Object > botttomView () {
184+ return super .botttomView (root );
185+ }
186+
187+ @ Override
188+ public int height () {
189+ return super .height (root );
190+ }
191+
192+ @ Override
193+ public int size () {
194+ return map .size ();
195+ }
196+
197+ @ Override
198+ public void clear () {
199+ root = null ;
200+ map .clear ();
144201 }
145202
146203 @ Override
0 commit comments