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