mirror of
https://github.com/TheAlgorithms/Java.git
synced 2025-07-26 05:59:22 +08:00
Tests added for BST DataStructures
This commit is contained in:
@ -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;
|
||||||
|
@ -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;
|
||||||
|
Reference in New Issue
Block a user