BinaryTree.java
package DataStructures.Trees;⏎
⏎
/**⏎
* This entire class is used to build a Binary Tree data structure.⏎
* There is the Node Class and the Tree Class, both explained below.⏎
*/⏎
⏎
⏎
/**⏎
* A binary tree is a data structure in which an element⏎
* has two successors(children). The left child is usually⏎
* smaller than the parent, and the right child is usually⏎
* bigger.⏎
*⏎
* @author Unknown⏎
*⏎
*/⏎
public class BinaryTree {⏎
⏎
/**⏎
* This class implements the nodes that will go on the Binary Tree.⏎
* They consist of the data in them, the node to the left, the node⏎
* to the right, and the parent from which they came from.⏎
*⏎
* @author Unknown⏎
*⏎
*/⏎
class Node {⏎
/** Data for the node */⏎
public int data;⏎
/** The Node to the left of this one */⏎
public Node left;⏎
/** The Node to the right of this one */⏎
public Node right;⏎
/** The parent of this node */⏎
public Node parent;⏎
⏎
/**⏎
* Constructor of Node⏎
*⏎
* @param value Value to put in the node⏎
*/⏎
public Node(int value) {⏎
data = value;⏎
left = null;⏎
right = null;⏎
parent = null;⏎
}⏎
}⏎
⏎
⏎
/** The root of the Binary Tree */⏎
private Node root;⏎
⏎
/**⏎
* Constructor⏎
*/⏎
public BinaryTree() {⏎
root = null;⏎
}⏎
⏎
/**⏎
* Method to find a Node with a certain value⏎
*⏎
* @param key Value being looked for⏎
* @return The node if it finds it, otherwise returns the parent⏎
*/⏎
public Node find(int key) {⏎
Node current = root;⏎
while (current != null) {⏎
if (key < current.data) {⏎
if (current.left == null)⏎
return current; //The key isn't exist, returns the parent⏎
current = current.left;⏎
} else if (key > current.data) {⏎
if (current.right == null)⏎
return current;⏎
current = current.right;⏎
} else { // If you find the value return it⏎
return current;⏎
}⏎
}⏎
return null;⏎
}⏎
⏎
/**⏎
* Inserts certain value into the Binary Tree⏎
*⏎
* @param value Value to be inserted⏎
*/⏎
public void put(int value) {⏎
Node newNode = new Node(value);⏎
if (root == null)⏎
root = newNode;⏎
else {⏎
//This will return the soon to be parent of the value you're inserting⏎
Node parent = find(value);⏎
⏎
//This if/else assigns the new node to be either the left or right child of the parent⏎
if (value < parent.data) {⏎
parent.left = newNode;⏎
parent.left.parent = parent;⏎
return;⏎
} else {⏎
parent.right = newNode;⏎
parent.right.parent = parent;⏎
return;⏎
}⏎
}⏎
}⏎
⏎
/**⏎
* Deletes a given value from the Binary Tree⏎
*⏎
* @param value Value to be deleted⏎
* @return If the value was deleted⏎
*/⏎
public boolean remove(int value) {⏎
//temp is the node to be deleted⏎
Node temp = find(value);⏎
⏎
//If the value doesn't exist⏎
if (temp.data != value)⏎
return false;⏎
⏎
//No children⏎
if (temp.right == null && temp.left == null) {⏎
if (temp == root)⏎
root = null;⏎
⏎
//This if/else assigns the new node to be either the left or right child of the parent⏎
else if (temp.parent.data < temp.data)⏎
temp.parent.right = null;⏎
else⏎
temp.parent.left = null;⏎
return true;⏎
}⏎
⏎
//Two children⏎
else if (temp.left != null && temp.right != null) {⏎
Node successor = findSuccessor(temp);⏎
⏎
//The left tree of temp is made the left tree of the successor⏎
successor.left = temp.left;⏎
successor.left.parent = successor;⏎
⏎
//If the successor has a right child, the child's grandparent is it's new parent⏎
if(successor.parent!=temp){⏎
if(successor.right!=null){⏎
successor.right.parent = successor.parent;⏎
successor.parent.left = successor.right;⏎
successor.right = temp.right;⏎
successor.right.parent = successor;⏎
}else{⏎
successor.parent.left=null;⏎
successor.right=temp.right;⏎
successor.right.parent=successor;⏎
}⏎
}⏎
⏎
if (temp == root) {⏎
successor.parent = null;⏎
root = successor;⏎
return true;⏎
}⏎
⏎
//If you're not deleting the root⏎
else {⏎
successor.parent = temp.parent;⏎
⏎
//This if/else assigns the new node to be either the left or right child of the parent⏎
if (temp.parent.data < temp.data)⏎
temp.parent.right = successor;⏎
else⏎
temp.parent.left = successor;⏎
return true;⏎
}⏎
}⏎
//One child⏎
else {⏎
//If it has a right child⏎
if (temp.right != null) {⏎
if (temp == root) {⏎
root = temp.right;⏎
return true;⏎
}⏎
⏎
temp.right.parent = temp.parent;⏎
⏎
//Assigns temp to left or right child⏎
if (temp.data < temp.parent.data)⏎
temp.parent.left = temp.right;⏎
else⏎
temp.parent.right = temp.right;⏎
return true;⏎
}⏎
//If it has a left child⏎
else {⏎
if (temp == root) {⏎
root = temp.left;⏎
return true;⏎
}⏎
⏎
temp.left.parent = temp.parent;⏎
⏎
//Assigns temp to left or right side⏎
if (temp.data < temp.parent.data)⏎
temp.parent.left = temp.left;⏎
else⏎
temp.parent.right = temp.left;⏎
return true;⏎
}⏎
}⏎
}⏎
⏎
/**⏎
* This method finds the Successor to the Node given.⏎
* Move right once and go left down the tree as far as you can⏎
*⏎
* @param n Node that you want to find the Successor of⏎
* @return The Successor of the node⏎
*/⏎
public Node findSuccessor(Node n) {⏎
if (n.right == null)⏎
return n;⏎
Node current = n.right;⏎
Node parent = n.right;⏎
while (current != null) {⏎
parent = current;⏎
current = current.left;⏎
}⏎
return parent;⏎
}⏎
⏎
/**⏎
* Returns the root of the Binary Tree⏎
*⏎
* @return the root of the Binary Tree⏎
*/⏎
public Node getRoot() {⏎
return root;⏎
}⏎
⏎
/**⏎
* Prints leftChild - root - rightChild⏎
*⏎
* @param localRoot The local root of the binary tree⏎
*/⏎
public void inOrder(Node localRoot) {⏎
if (localRoot != null) {⏎
inOrder(localRoot.left);⏎
System.out.print(localRoot.data + " ");⏎
inOrder(localRoot.right);⏎
}⏎
}⏎
⏎
/**⏎
* Prints root - leftChild - rightChild⏎
*⏎
* @param localRoot The local root of the binary tree⏎
*/⏎
public void preOrder(Node localRoot) {⏎
if (localRoot != null) {⏎
System.out.print(localRoot.data + " ");⏎
preOrder(localRoot.left);⏎
preOrder(localRoot.right);⏎
}⏎
}⏎
⏎
/**⏎
* Prints rightChild - leftChild - root⏎
*⏎
* @param localRoot The local root of the binary tree⏎
*/⏎
public void postOrder(Node localRoot) {⏎
if (localRoot != null) {⏎
postOrder(localRoot.left);⏎
postOrder(localRoot.right);⏎
System.out.print(localRoot.data + " ");⏎
}⏎
}⏎
}⏎