Start Typing !!! type the highlighted character. You can't scroll once you start typing.
filename

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 + " ");

}

}

}