diff --git a/DataStructures/Trees/BSTIterative.java b/DataStructures/Trees/BSTIterative.java new file mode 100644 index 000000000..b08b0057a --- /dev/null +++ b/DataStructures/Trees/BSTIterative.java @@ -0,0 +1,265 @@ +/** + * + * + *
I have made public functions as methods and to actually implement recursive approach I have + * used private methods + * + * @author [Lakhan Nad](https://github.com/Lakhan-Nad) + */ +public class BSTRecursive { + /** only data member is root of BST */ + private Node root; + /** Constructor use to initialize node as null */ + BSTRecursive() { + root = null; + } + + /** + * Recursive method to delete a data if present in BST. + * + * @param root the current node to search for data + * @param data the value to be deleted + * @return Node the updated value of root parameter after delete operation + */ + private Node delete(Node root, int data) { + if (root == null) { + System.out.println("No such data present in BST."); + } else if (root.data > data) { + root.left = delete(root.left, data); + } else if (root.data < data) { + root.right = delete(root.right, data); + } else { + if (root.right == null && root.left == null) { // If it is leaf node + root = null; + } else if (root.left == null) { // If only right node is present + Node temp = root.right; + root.right = null; + root = temp; + } else if (root.right == null) { // Only left node is present + Node temp = root.left; + root.left = null; + root = temp; + } else { // both child are present + Node temp = root.right; + // Find leftmost child of right subtree + while (temp.left != null) { + temp = temp.left; + } + root.data = temp.data; + root.right = delete(root.right, temp.data); + } + } + return root; + } + + /** + * Recursive insertion of value in BST. + * + * @param root to check if the data can be inserted in current node or its subtree + * @param data the value to be inserted + * @return the modified value of the root parameter after insertion + */ + private Node insert(Node root, int data) { + if (root == null) { + root = new Node(data); + } else if (root.data > data) { + root.left = insert(root.left, data); + } else if (root.data < data) { + root.right = insert(root.right, data); + } + return root; + } + + /** + * Recursively print Preorder traversal of the BST + * + * @param root + */ + private void preOrder(Node root) { + if (root == null) { + return; + } + System.out.print(root.data + " "); + if (root.left != null) { + preOrder(root.left); + } + if (root.right != null) { + preOrder(root.right); + } + } + + /** + * Recursively print Postorder travesal of BST. + * + * @param root + */ + private void postOrder(Node root) { + if (root == null) { + return; + } + if (root.left != null) { + postOrder(root.left); + } + if (root.right != null) { + postOrder(root.right); + } + System.out.print(root.data + " "); + } + + /** + * Recursively print Inorder traversal of BST. + * + * @param root + */ + private void inOrder(Node root) { + if (root == null) { + return; + } + if (root.left != null) { + inOrder(root.left); + } + System.out.print(root.data + " "); + if (root.right != null) { + inOrder(root.right); + } + } + + /** + * Serach recursively if the given value is present in BST or not. + * + * @param root the current node to check + * @param data the value to be checked + * @return boolean if data is present or not + */ + private boolean search(Node root, int data) { + if (root == null) { + return false; + } else if (root.data == data) { + return true; + } else if (root.data > data) { + return search(root.left, data); + } else { + return search(root.right, data); + } + } + + /** + * add in BST. if the value is not already present it is inserted or else no change takes place. + * + * @param data the value to be inserted + */ + public void add(int data) { + this.root = insert(this.root, data); + } + + /** + * If data is present in BST delete it else do nothing. + * + * @param data the value to be removed + */ + public void remove(int data) { + this.root = delete(this.root, data); + } + + /** To call inorder traversal on tree */ + public void inorder() { + System.out.println("Inorder traversal of this tree is:"); + inOrder(this.root); + System.out.println(); // for next line + } + + /** To call postorder traversal on tree */ + public void postorder() { + System.out.println("Postorder traversal of this tree is:"); + postOrder(this.root); + System.out.println(); // for next li + } + + /** To call preorder traversal on tree. */ + public void preorder() { + System.out.println("Preorder traversal of this tree is:"); + preOrder(this.root); + System.out.println(); // for next li + } + + /** + * To check if given value is present in tree or not. + * + * @param data + */ + public void find(int data) { + if (search(this.root, data)) { + System.out.println(data + " is present in given BST."); + return true; + } + System.out.println(data + " not found."); + return false; + } + + /** The Node class used for building binary search tree */ + private class Node { + int data; + Node left; + Node right; + + /** Constructor with data as parameter */ + Node(int d) { + data = d; + left = null; + right = null; + } + } +}