In: Computer Science
Complete the Tree class within the following program: BalancingTrees.zip. There are three two classes and one driver in this program. You just need to complete or add the Tree class code.
In java please.
The code for tree class:
public class Tree {
Node root;
public Tree() {
root = null;
}
public int getHeight(Node node) {
if (node == null)
return 0;
return node.height;
}
public Node insertANDbalance(Node node, int element) {
// base case
if (node == null)
return (new Node(element));
// inserting new elements into tree following Binary tree
rules
if (element < node.key)
node.left = insertANDbalance(node.left, element);
else if (element > node.key)
node.right = insertANDbalance(node.right, element);
else
return node;
// updating heights of left and right
if (getHeight(node.left) > getHeight(node.right))
node.height = 1 + getHeight(node.left);
else
node.height = 1 + getHeight(node.right);
// balance tree as each new element is added to it
int balance;
if (node == null)
balance = 0;
else
balance = getHeight(node.left) -
getHeight(node.right);
// left -> left
if (balance > 1 && element < node.left.key)
return rightRotate(node);
// right -> right
else if (balance < -1 && element >
node.right.key)
return leftRotate(node);
// left -> right
else if (balance > 1 && element > node.left.key)
{
node.left = leftRotate(node.left);
return rightRotate(node);
}
// right -> left
else if (balance < -1 && element < node.right.key)
{
node.right = rightRotate(node.right);
return leftRotate(node);
}
return node;
}
public Node rightRotate(Node root) {
Node newRoot = root.left;
Node Temp = newRoot.right;
// Rotate
newRoot.right = root;
root.left = Temp;
// Update
if (getHeight(root.left) >
getHeight(root.right))
root.height =
getHeight(root.left)+1;
else
root.height =
getHeight(root.right)+1;
if (getHeight(newRoot.left) >
getHeight(newRoot.right) + 1)
newRoot.height =
getHeight(newRoot.left)+1;
else
newRoot.height =
getHeight(newRoot.right)+1;
return newRoot;
}
public Node leftRotate(Node root) {
Node newRoot = root;
// for students to complete for an
assignment
return newRoot;
}
public static void printTree(Node node, int n) {
n += 5;
// Base case
if (node == null)
return;
printTree(node.right, n);
for (int i = 5; i < n; i++)
System.out.print(" ");
System.out.println(node.key);
printTree(node.left, n);
}
}
The code for node class:
public class Node {
protected int key, height;
protected Node left, right;
public Node(int item) {
key = item;
height = 1;
left = right = null;
}
}
The driver:
public class TreeDriver{
public static void main(String[] args) {
Tree tree = new Tree();
/* 6
* / \
* 2 7
* / \
* 1 4
* / \
* 3 5
*
*/
tree.root =
tree.insertANDbalance(tree.root, 6);
tree.root = tree.insertANDbalance(tree.root, 2);
tree.root = tree.insertANDbalance(tree.root, 1);
tree.root = tree.insertANDbalance(tree.root, 4);
tree.root = tree.insertANDbalance(tree.root, 3);
tree.root = tree.insertANDbalance(tree.root, 5);
tree.root = tree.insertANDbalance(tree.root, 7);
tree.printTree(tree.root, 0);
}
}
Program Screenshot for Indentation Reference:
Program code to copy:
public class Tree {
Node root;
public Tree() {
root = null;
}
public int getHeight(Node node) {
if (node == null)
return 0;
return
node.height;
}
public Node insertANDbalance(Node node, int element) {
// base case
if (node == null)
return (new Node(element));
// inserting new
elements into tree following Binary tree rules
if (element <
node.key)
node.left = insertANDbalance(node.left, element);
else if (element >
node.key)
node.right = insertANDbalance(node.right, element);
else
return node;
// updating heights
of left and right
if (getHeight(node.left)
> getHeight(node.right))
node.height = 1 + getHeight(node.left);
else
node.height = 1 + getHeight(node.right);
// balance tree as
each new element is added to it
int balance;
if (node == null)
balance = 0;
else
balance = getHeight(node.left) - getHeight(node.right);
// left ->
left
if (balance > 1
&& element < node.left.key)
return rightRotate(node);
// right ->
right
else if (balance < -1
&& element > node.right.key)
return leftRotate(node);
// left ->
right
else if (balance > 1
&& element > node.left.key) {
node.left = leftRotate(node.left);
return rightRotate(node);
}
// right ->
left
else if (balance < -1
&& element < node.right.key) {
node.right = rightRotate(node.right);
return leftRotate(node);
}
return node;
}
public Node rightRotate(Node root) {
Node newRoot =
root.left;
Node Temp =
newRoot.right;
// Rotate
newRoot.right =
root;
root.left = Temp;
// Update
if (getHeight(root.left)
> getHeight(root.right))
root.height = getHeight(root.left) + 1;
else
root.height = getHeight(root.right) + 1;
if
(getHeight(newRoot.left) > getHeight(newRoot.right) + 1)
newRoot.height = getHeight(newRoot.left) + 1;
else
newRoot.height = getHeight(newRoot.right) + 1;
return newRoot;
}
public Node leftRotate(Node root) {
Node newRoot =
root.right;
Node Temp = newRoot.left;
// Rotate
newRoot.left =
root;
root.right = Temp;
// Update
if (getHeight(root.left)
> getHeight(root.right))
root.height = getHeight(root.left) + 1;
else
root.height = getHeight(root.right) + 1;
if
(getHeight(newRoot.left) > getHeight(newRoot.right) + 1)
newRoot.height = getHeight(newRoot.left) + 1;
else
newRoot.height = getHeight(newRoot.right) + 1;
// return new
root
return newRoot;
}
public static void printTree(Node node, int
n) {
n += 5;
// Base case
if (node == null)
return;
printTree(node.right,
n);
for (int i = 5; i <
n; i++)
System.out.print(" ");
System.out.println(node.key);
printTree(node.left,
n);
}
}
Sample Output:
This created a balanced tree: