Tests added for BST DataStructures

This commit is contained in:
Lakhan Nad
2020-08-18 21:03:31 +05:30
parent efdd1ddd42
commit 75480d44bf
2 changed files with 118 additions and 73 deletions

View File

@ -3,9 +3,9 @@
* *
* <h1>Binary Search Tree (Iterative)</h1> * <h1>Binary Search Tree (Iterative)</h1>
* *
* An implementation of BST iteratively. Binary Search Tree is a binary tree which satisfies three * <p>An implementation of BST iteratively. Binary Search Tree is a binary tree which satisfies
* properties: left child is less than root node, right child is grater than root node, both left * three properties: left child is less than root node, right child is grater than root node, both
* and right childs must themselves be a BST. * left and right childs must themselves be a BST.
* *
* @author [Lakhan Nad](https://github.com/Lakhan-Nad) * @author [Lakhan Nad](https://github.com/Lakhan-Nad)
*/ */
@ -20,6 +20,28 @@ public class BSTIterative {
root = null; root = null;
} }
/** main function for tests */
public static void main(String[] args) {
BSTIterative tree = new BSTIterative();
tree.add(3);
tree.add(2);
tree.add(9);
assert !tree.find(4) : "4 is not yet present in BST";
assert tree.find(2) : "2 should be present in BST";
tree.remove(2);
assert !tree.find(2) : "2 was just deleted from BST";
tree.remove(1);
assert !tree.find(1) : "Since 1 was not present so find deleting would do no change";
tree.add(30);
tree.add(40);
assert tree.find(40) : "40 was inserted but not found";
/*
Will print following order
3 9 30 40
*/
tree.inorder();
}
/** /**
* A method to insert a new value in BST. If the given value is already present in BST the * A method to insert a new value in BST. If the given value is already present in BST the
* insertion is ignored. * insertion is ignored.
@ -47,24 +69,24 @@ public class BSTIterative {
return; // if data already present we ignore insertion return; // if data already present we ignore insertion
} }
} }
/* Creates a newnode with the value passed /* Creates a newNode with the value passed
* Since this data doesn't already exists * Since this data doesn't already exists
*/ */
Node newnode = new Node(data); Node newNode = new Node(data);
/* If the parent node is null /* If the parent node is null
* then the insertion is to be done in * then the insertion is to be done in
* root itself. * root itself.
*/ */
if (parent == null) { if (parent == null) {
this.root = newnode; this.root = newNode;
} else { } else {
/* Check if insertion is to be made in /* Check if insertion is to be made in
* left or right subtree. * left or right subtree.
*/ */
if (rightOrLeft == 0) { if (rightOrLeft == 0) {
parent.left = newnode; parent.left = newNode;
} else { } else {
parent.right = newnode; parent.right = newNode;
} }
} }
} }
@ -250,7 +272,7 @@ public class BSTIterative {
} }
/** The Node class used for building binary search tree */ /** The Node class used for building binary search tree */
private class Node { private static class Node {
int data; int data;
Node left; Node left;
Node right; Node right;

View File

@ -16,137 +16,160 @@
public class BSTRecursive { public class BSTRecursive {
/** only data member is root of BST */ /** only data member is root of BST */
private Node root; private Node root;
/** Constructor use to initialize node as null */ /** Constructor use to initialize node as null */
BSTRecursive() { BSTRecursive() {
root = null; root = null;
} }
/** main function for tests */
public static void main(String[] args) {
BSTIterative tree = new BSTIterative();
tree.add(5);
tree.add(10);
tree.add(9);
assert !tree.find(4) : "4 is not yet present in BST";
assert tree.find(10) : "10 should be present in BST";
tree.remove(9);
assert !tree.find(9) : "9 was just deleted from BST";
tree.remove(1);
assert !tree.find(1) : "Since 1 was not present so find deleting would do no change";
tree.add(20);
tree.add(70);
assert tree.find(70) : "70 was inserted but not found";
/*
Will print in following order
5 10 20 70
*/
tree.inorder();
}
/** /**
* Recursive method to delete a data if present in BST. * Recursive method to delete a data if present in BST.
* *
* @param root the current node to search for data * @param node the current node to search for data
* @param data the value to be deleted * @param data the value to be deleted
* @return Node the updated value of root parameter after delete operation * @return Node the updated value of root parameter after delete operation
*/ */
private Node delete(Node root, int data) { private Node delete(Node node, int data) {
if (root == null) { if (node == null) {
System.out.println("No such data present in BST."); System.out.println("No such data present in BST.");
} else if (root.data > data) { } else if (node.data > data) {
root.left = delete(root.left, data); node.left = delete(node.left, data);
} else if (root.data < data) { } else if (node.data < data) {
root.right = delete(root.right, data); node.right = delete(node.right, data);
} else { } else {
if (root.right == null && root.left == null) { // If it is leaf node if (node.right == null && node.left == null) { // If it is leaf node
root = null; node = null;
} else if (root.left == null) { // If only right node is present } else if (node.left == null) { // If only right node is present
Node temp = root.right; Node temp = node.right;
root.right = null; node.right = null;
root = temp; node = temp;
} else if (root.right == null) { // Only left node is present } else if (node.right == null) { // Only left node is present
Node temp = root.left; Node temp = node.left;
root.left = null; node.left = null;
root = temp; node = temp;
} else { // both child are present } else { // both child are present
Node temp = root.right; Node temp = node.right;
// Find leftmost child of right subtree // Find leftmost child of right subtree
while (temp.left != null) { while (temp.left != null) {
temp = temp.left; temp = temp.left;
} }
root.data = temp.data; node.data = temp.data;
root.right = delete(root.right, temp.data); node.right = delete(node.right, temp.data);
} }
} }
return root; return node;
} }
/** /**
* Recursive insertion of value in BST. * Recursive insertion of value in BST.
* *
* @param root to check if the data can be inserted in current node or its subtree * @param node to check if the data can be inserted in current node or its subtree
* @param data the value to be inserted * @param data the value to be inserted
* @return the modified value of the root parameter after insertion * @return the modified value of the root parameter after insertion
*/ */
private Node insert(Node root, int data) { private Node insert(Node node, int data) {
if (root == null) { if (node == null) {
root = new Node(data); node = new Node(data);
} else if (root.data > data) { } else if (node.data > data) {
root.left = insert(root.left, data); node.left = insert(node.left, data);
} else if (root.data < data) { } else if (node.data < data) {
root.right = insert(root.right, data); node.right = insert(node.right, data);
} }
return root; return node;
} }
/** /**
* Recursively print Preorder traversal of the BST * Recursively print Preorder traversal of the BST
* *
* @param root * @param node the root node
*/ */
private void preOrder(Node root) { private void preOrder(Node node) {
if (root == null) { if (node == null) {
return; return;
} }
System.out.print(root.data + " "); System.out.print(node.data + " ");
if (root.left != null) { if (node.left != null) {
preOrder(root.left); preOrder(node.left);
} }
if (root.right != null) { if (node.right != null) {
preOrder(root.right); preOrder(node.right);
} }
} }
/** /**
* Recursively print Postorder travesal of BST. * Recursively print Postorder travesal of BST.
* *
* @param root * @param node the root node
*/ */
private void postOrder(Node root) { private void postOrder(Node node) {
if (root == null) { if (node == null) {
return; return;
} }
if (root.left != null) { if (node.left != null) {
postOrder(root.left); postOrder(node.left);
} }
if (root.right != null) { if (node.right != null) {
postOrder(root.right); postOrder(node.right);
} }
System.out.print(root.data + " "); System.out.print(node.data + " ");
} }
/** /**
* Recursively print Inorder traversal of BST. * Recursively print Inorder traversal of BST.
* *
* @param root * @param node the root node
*/ */
private void inOrder(Node root) { private void inOrder(Node node) {
if (root == null) { if (node == null) {
return; return;
} }
if (root.left != null) { if (node.left != null) {
inOrder(root.left); inOrder(node.left);
} }
System.out.print(root.data + " "); System.out.print(node.data + " ");
if (root.right != null) { if (node.right != null) {
inOrder(root.right); inOrder(node.right);
} }
} }
/** /**
* Serach recursively if the given value is present in BST or not. * Serach recursively if the given value is present in BST or not.
* *
* @param root the current node to check * @param node the current node to check
* @param data the value to be checked * @param data the value to be checked
* @return boolean if data is present or not * @return boolean if data is present or not
*/ */
private boolean search(Node root, int data) { private boolean search(Node node, int data) {
if (root == null) { if (node == null) {
return false; return false;
} else if (root.data == data) { } else if (node.data == data) {
return true; return true;
} else if (root.data > data) { } else if (node.data > data) {
return search(root.left, data); return search(node.left, data);
} else { } else {
return search(root.right, data); return search(node.right, data);
} }
} }
@ -192,9 +215,9 @@ public class BSTRecursive {
/** /**
* To check if given value is present in tree or not. * To check if given value is present in tree or not.
* *
* @param data * @param data the data to be found for
*/ */
public void find(int data) { public boolean find(int data) {
if (search(this.root, data)) { if (search(this.root, data)) {
System.out.println(data + " is present in given BST."); System.out.println(data + " is present in given BST.");
return true; return true;
@ -204,7 +227,7 @@ public class BSTRecursive {
} }
/** The Node class used for building binary search tree */ /** The Node class used for building binary search tree */
private class Node { private static class Node {
int data; int data;
Node left; Node left;
Node right; Node right;