Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit afc38dc

Browse files
inserted code for tress by Ds Guy
1 parent cd76485 commit afc38dc

12 files changed

+1331
-0
lines changed

‎src/dsGuy/AVLTree/AVLTree.java

Lines changed: 260 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,260 @@
1+
package dsGuy.AVLTree;
2+
3+
import java.util.LinkedList;
4+
import java.util.Queue;
5+
import dsGuy.node.*;
6+
7+
public class AVLTree {
8+
BinaryNode root;
9+
public BinaryNode getRoot() {
10+
return root;
11+
}
12+
13+
14+
// Constructor
15+
AVLTree() {
16+
root = null;
17+
}
18+
19+
20+
// Insert values in AVL Tree
21+
void insert(int value) {
22+
root = insert(root, value);
23+
}// end of method
24+
25+
26+
// Helper Method
27+
BinaryNode insert(BinaryNode currentNode, int value) {
28+
// THIS ELSE_IF BLOCK IS BST CONDITION
29+
if (currentNode == null) {
30+
System.out.println("Successfully inserted " + value + " in AVL Tree");
31+
return createNewNode(value);
32+
} else if (value <= currentNode.getValue()) {
33+
currentNode.setLeft(insert(currentNode.getLeft(), value));
34+
} else {
35+
currentNode.setRight(insert(currentNode.getRight(), value));
36+
}
37+
38+
// THIS IS WHERE WE WILL DO AVL SPECIFIC WORK
39+
int balance = checkBalance(currentNode.getLeft(), currentNode.getRight());
40+
if (balance > 1) {
41+
if (checkBalance(currentNode.getLeft().getLeft(), currentNode.getLeft().getRight()) > 0) {
42+
currentNode = rightRotate(currentNode);// LL Condition
43+
} else {
44+
currentNode.setLeft(leftRotate(currentNode.getLeft())); // LR Condition
45+
currentNode = rightRotate(currentNode);
46+
}
47+
} else if (balance < -1) {
48+
if (checkBalance(currentNode.getRight().getRight(), currentNode.getRight().getLeft()) > 0) {
49+
currentNode = leftRotate(currentNode);// RR Condition
50+
51+
} else {
52+
currentNode.setRight(rightRotate(currentNode.getRight()));// RL Condition
53+
currentNode = leftRotate(currentNode);
54+
55+
}
56+
}
57+
58+
if (currentNode.getLeft() != null) {
59+
currentNode.getLeft().setHeight(calculateHeight(currentNode.getLeft()));
60+
}
61+
if (currentNode.getRight() != null) {
62+
currentNode.getRight().setHeight(calculateHeight(currentNode.getRight()));
63+
}
64+
currentNode.setHeight(calculateHeight(currentNode));
65+
return currentNode;
66+
67+
}// end of method
68+
69+
70+
// Helper Method
71+
private BinaryNode leftRotate(BinaryNode currentNode) {
72+
BinaryNode newRoot = currentNode.getRight();
73+
currentNode.setRight(currentNode.getRight().getLeft());
74+
newRoot.setLeft(currentNode);
75+
currentNode.setHeight(calculateHeight(currentNode));
76+
newRoot.setHeight(calculateHeight(newRoot));
77+
return newRoot;
78+
}// end of method
79+
80+
81+
// Helper Method
82+
private BinaryNode rightRotate(BinaryNode currentNode) {
83+
BinaryNode newRoot = currentNode.getLeft();
84+
currentNode.setLeft(currentNode.getLeft().getRight());
85+
newRoot.setRight(currentNode);
86+
currentNode.setHeight(calculateHeight(currentNode));
87+
newRoot.setHeight(calculateHeight(newRoot));
88+
return newRoot;
89+
}// end of method
90+
91+
92+
// Helper Method
93+
private int checkBalance(BinaryNode rootLeft, BinaryNode rootRight) {
94+
if((rootLeft == null) && (rootRight == null)) { //if current node is a leaf node then no need to check balance of its children
95+
return 0;
96+
}else if (rootLeft == null) {
97+
return -1 * (rootRight.getHeight() + 1); // if left node node is not there then simply return right node's
98+
// height + 1
99+
// we need to make it -1 because blank height is considered
100+
// having height as '-1'
101+
} else if (rootRight == null) {
102+
return rootLeft.getHeight() + 1;
103+
} else {
104+
return rootLeft.getHeight() - rootRight.getHeight(); // +1 is not required, as both right and left child
105+
// exits and 1 gets nullified
106+
}
107+
}// end of method
108+
109+
110+
// Calculate height of Node
111+
private int calculateHeight(BinaryNode currentNode) {
112+
if (currentNode == null) {
113+
return 0;
114+
}
115+
return 1 + Math.max((currentNode.getLeft() != null ? currentNode.getLeft().getHeight() : -1),
116+
(currentNode.getRight() != null ? currentNode.getRight().getHeight() : -1));
117+
118+
}// end of method
119+
120+
121+
// creates a new blank new node
122+
public BinaryNode createNewNode(int value) {
123+
BinaryNode node = new BinaryNode();
124+
node.setValue(value);
125+
node.setHeight(0);// Since this is a leaf node, its height is 0
126+
return node;
127+
}// end of method
128+
129+
130+
// Level order traversal of BST
131+
void levelOrderTraversal() {
132+
Queue<BinaryNode> queue = new LinkedList<BinaryNode>();
133+
queue.add(root);
134+
System.out.println("Printing Level order traversal of AVL Tree...");
135+
if (root == null) {
136+
System.out.println("Tree does not exists !");
137+
return;
138+
}
139+
while (!queue.isEmpty()) {
140+
BinaryNode presentNode = queue.remove();
141+
System.out.print(presentNode.getValue() + " ");
142+
if (presentNode.getLeft() != null)
143+
queue.add(presentNode.getLeft());
144+
if (presentNode.getRight() != null)
145+
queue.add(presentNode.getRight());
146+
}
147+
}// end of method
148+
149+
150+
// Deleting a node from BST
151+
public void deleteNodeOfBST(int value) {
152+
System.out.println("Deleting " + value + " from AVL Tree ...");
153+
root = deleteNodeOfBST(root, value);
154+
}
155+
156+
157+
// Helper Method for delete
158+
public BinaryNode deleteNodeOfBST(BinaryNode currentNode, int value) {
159+
// THIS ELSE_IF BLOCK IS BST CONDITION
160+
if (currentNode == null)
161+
return null;
162+
if (value < currentNode.getValue()) {
163+
currentNode.setLeft(deleteNodeOfBST(currentNode.getLeft(), value));
164+
} else if (value > currentNode.getValue()) {
165+
currentNode.setRight(deleteNodeOfBST(currentNode.getRight(), value));
166+
} else { // If currentNode is the node to be deleted
167+
//System.out.println("currentNode is the node to be deleted");
168+
if (currentNode.getLeft() != null && currentNode.getRight() != null) { // if nodeToBeDeleted have both children
169+
BinaryNode temp = currentNode;
170+
BinaryNode minNodeForRight = minimumElement(temp.getRight());// Finding minimum element from right subtree
171+
currentNode.setValue(minNodeForRight.getValue()); // Replacing current node with minimum node from right subtree
172+
deleteNodeOfBST(currentNode.getRight(), minNodeForRight.getValue());// Deleting minimum node from right now
173+
} else if (currentNode.getLeft() != null) {// if nodeToBeDeleted has only left child
174+
currentNode = currentNode.getLeft();
175+
} else if (currentNode.getRight() != null) {// if nodeToBeDeleted has only right child
176+
currentNode = currentNode.getRight();
177+
} else { // if nodeToBeDeleted do not have child (Leaf node)
178+
//System.out.println("This node is leaf node");
179+
currentNode = null;
180+
}
181+
return currentNode;// if it is a leaf node,then no need to do balancing for this node, do only for its ancestors
182+
}
183+
184+
// THIS IS WHERE WE WILL DO AVL SPECIFIC WORK
185+
int balance = checkBalance(currentNode.getLeft(), currentNode.getRight());
186+
if (balance > 1) {
187+
if (checkBalance(currentNode.getLeft().getLeft(), currentNode.getLeft().getRight()) > 0) {
188+
currentNode = rightRotate(currentNode);// LL Condition
189+
} else {
190+
currentNode.setLeft(leftRotate(currentNode.getLeft())); // LR Condition
191+
currentNode = rightRotate(currentNode);
192+
}
193+
} else if (balance < -1) {
194+
if (checkBalance(currentNode.getRight().getRight(), currentNode.getRight().getLeft()) > 0) {
195+
currentNode = leftRotate(currentNode);// RR Condition
196+
} else {
197+
currentNode.setRight(rightRotate(currentNode.getRight()));// RL Condition
198+
currentNode = leftRotate(currentNode);
199+
}
200+
}
201+
202+
if (currentNode.getLeft() != null) {
203+
currentNode.getLeft().setHeight(calculateHeight(currentNode.getLeft()));
204+
}
205+
if (currentNode.getRight() != null) {
206+
currentNode.getRight().setHeight(calculateHeight(currentNode.getRight()));
207+
}
208+
currentNode.setHeight(calculateHeight(currentNode));
209+
return currentNode;
210+
211+
}// end of method
212+
213+
214+
// Get minimum element in binary search tree
215+
public static BinaryNode minimumElement(BinaryNode root) {
216+
if (root.getLeft() == null)
217+
return root;
218+
else {
219+
return minimumElement(root.getLeft());
220+
}
221+
}// end of method
222+
223+
224+
void printTreeGraphically() {
225+
Queue<BinaryNode> queue = new LinkedList<BinaryNode>();
226+
Queue<Integer> level = new LinkedList<Integer>();
227+
228+
int CurrentLevel = 1;
229+
boolean previousLevelWasAllNull = false;
230+
queue.add(root);
231+
level.add(1);
232+
233+
System.out.println("\nPrinting Level order traversal of Tree...");
234+
if(root == null) {
235+
System.out.println("Tree does not exists !");
236+
return;
237+
}
238+
239+
while (!queue.isEmpty()) {
240+
if(CurrentLevel == level.peek()) { //if we are in the same level
241+
if(queue.peek()==null) {
242+
queue.add(null);level.add(CurrentLevel+1);
243+
}else {
244+
queue.add(queue.peek().getLeft());level.add(CurrentLevel+1);
245+
queue.add(queue.peek().getRight());level.add(CurrentLevel+1);
246+
previousLevelWasAllNull = false;
247+
}
248+
System.out.print(queue.remove() + " ");level.remove();
249+
}else { //level has changed
250+
System.out.println("\n");
251+
CurrentLevel++;
252+
if(previousLevelWasAllNull == true) {
253+
break;
254+
}
255+
previousLevelWasAllNull = true;
256+
}
257+
}//end of loop
258+
}//end of method
259+
260+
}// end of class

‎src/dsGuy/AVLTree/Main.java

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package dsGuy.AVLTree;
2+
3+
public class Main {
4+
5+
public static void main(String[] args) {
6+
7+
// Constructor
8+
AVLTree tree = new AVLTree();
9+
10+
// Insert values in AVL Tree
11+
12+
13+
tree.insert(30);
14+
15+
16+
tree.insert(10);
17+
tree.insert(5);
18+
tree.insert(3);
19+
tree.insert(4);
20+
tree.insert(50);
21+
tree.insert(65);
22+
tree.insert(1);
23+
24+
tree.levelOrderTraversal();
25+
tree.printTreeGraphically();
26+
27+
tree.deleteNodeOfBST(5);//LL Condition
28+
tree.printTreeGraphically();
29+
30+
tree.insert(2);
31+
tree.printTreeGraphically();
32+
33+
tree.deleteNodeOfBST(4);//LR Condition
34+
tree.printTreeGraphically();
35+
36+
tree.insert(20);
37+
tree.deleteNodeOfBST(65);//RR Condition
38+
tree.printTreeGraphically();
39+
40+
tree.insert(40);
41+
tree.deleteNodeOfBST(20);//RL Condition
42+
tree.printTreeGraphically();
43+
44+
}// end of method
45+
}// end of class

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /