-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAVLTree.java
178 lines (138 loc) · 3.57 KB
/
AVLTree.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
import java.util.*;
class AVL {
public class Node {
private int value;
private Node left;
private Node right;
private int height;
public Node(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
private Node root;
public AVL() {
}
public int height() {
return height(root);
}
private int height(Node node) {
if (node == null) {
return -1;
}
return node.height;
}
public void insert(int value) {
root = insert(value, root);
}
private Node insert(int value, Node node) {
if (node == null) {
node = new Node(value);
return node;
}
if (value < node.value) {
node.left = insert(value, node.left);
}
if (value > node.value) {
node.right = insert(value, node.right);
}
node.height = Math.max(height(node.left), height(node.right)) + 1;
return rotate(node);
}
private Node rotate(Node node) {
if (height(node.left) - height(node.right) > 1) {
// left heavy
if(height(node.left.left) - height(node.left.right) > 0) {
// left left case
return rightRotate(node);
}
if(height(node.left.left) - height(node.left.right) < 0) {
// left right case
node.left = leftRotate(node.left);
return rightRotate(node);
}
}
if (height(node.left) - height(node.right) < -1) {
// right heavy
if(height(node.right.left) - height(node.right.right) < 0) {
// right right case
return leftRotate(node);
}
if(height(node.right.left) - height(node.right.right) > 0) {
// left right case
node.right = rightRotate(node.right);
return leftRotate(node);
}
}
return node;
}
public Node rightRotate(Node p) {
Node c = p.left;
Node t = c.right;
c.right = p;
p.left = t;
p.height = Math.max(height(p.left), height(p.right) + 1);
c.height = Math.max(height(c.left), height(c.right) + 1);
return c;
}
public Node leftRotate(Node c) {
Node p = c.right;
Node t = p.left;
p.left = c;
c.right = t;
p.height = Math.max(height(p.left), height(p.right) + 1);
c.height = Math.max(height(c.left), height(c.right) + 1);
return p;
}
public void populate(int[] nums) {
for (int i = 0; i < nums.length; i++) {
this.insert(nums[i]);
}
}
public void populatedSorted(int[] nums) {
populatedSorted(nums, 0, nums.length);
}
private void populatedSorted(int[] nums, int start, int end) {
if (start >= end) {
return;
}
int mid = (start + end) / 2;
this.insert(nums[mid]);
populatedSorted(nums, start, mid);
populatedSorted(nums, mid + 1, end);
}
public void display() {
display(this.root, "Root Node: ");
}
private void display(Node node, String details) {
if (node == null) {
return;
}
System.out.println(details + node.value);
display(node.left, "Left child of " + node.value + " : ");
display(node.right, "Right child of " + node.value + " : ");
}
public boolean isEmpty() {
return root == null;
}
public boolean balanced() {
return balanced(root);
}
private boolean balanced(Node node) {
if (node == null) {
return true;
}
return Math.abs(height(node.left) - height(node.right)) <= 1 && balanced(node.left) && balanced(node.right);
}
}
class AVLMain {
public static void main(String[] args) {
AVL tree = new AVL();
for(int i=0; i < 1000; i++) {
tree.insert(i);
}
System.out.println(tree.height());
}
}