-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
921828e
commit b952647
Showing
7 changed files
with
355 additions
and
30 deletions.
There are no files selected for viewing
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,171 @@ | ||
package advance; | ||
|
||
class AVLTree { | ||
|
||
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 AVLTree() {} | ||
|
||
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 num : nums) { | ||
this.insert(num); | ||
} | ||
} | ||
|
||
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); | ||
} | ||
|
||
public static void main(String[] args) { | ||
AVLTree avlTree=new AVLTree(); | ||
for (int i = 0; i < 1000; i++){ | ||
avlTree.insert(i); | ||
} | ||
System.out.println(avlTree.height()); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.