Below is the code for "Inorder Successor in Binary Search Tree"
Question from GeeksForGeeks: https://www.geeksforgeeks.org/inorder-successor-in-binary-search-tree/
Iterative approach:
Question from GeeksForGeeks: https://www.geeksforgeeks.org/inorder-successor-in-binary-search-tree/
Iterative approach:
public class BinarySearchTree { public Node root; public int FindNextSuccessor(int key) { if (root == null) return -1; Node current = root; int potentialSuccessor = -1; while (current != null) { if (current.key == key) { if (current.right == null) //If there is no right then it will be potential sucessor return potentialSuccessor; else return this.GetMinValue(current.right); } else if (key < current.key) // key will in left sub-tree { potentialSuccessor = current.key; current = current.left; } else // key will be right sub-tree { //potentialSuccessor = potentialSuccessor; It will be the parent successor value current = current.right; } } return -1; // Key does't exist } private int GetMinValue(Node node) { if (node == null) return -1; ; Node current = node; while (current.left != null) { current = current.left; } return current.key; } }
Recursion approach:
public class BinarySearchTree_Recursion { public Node root; public int FindNextSuccessor(int key) { if (root == null) return -1; return this.FindNextSuccessorRec(key, this.root, -1);//Roots potentialSuccessor is -1 if right is null. } private int FindNextSuccessorRec(int key, Node node, int potentialSuccessor) { if (node == null) return -1; if (node.key == key) { if (node.right == null) //If there is no right then it will be potential sucessor return potentialSuccessor; else return this.GetMinValueRec(node.right); } else if (key < node.key) { return this.FindNextSuccessorRec(key, node.left, node.key); } else { return this.FindNextSuccessorRec(key, node.right, potentialSuccessor); } } private int GetMinValueRec(Node node) { if (node == null) return -1; if (node.left == null) return node.key; else return this.GetMinValueRec(node.left); } }
Driver program:
static void Main(string[] args) { BinarySearchTree bst = new BinarySearchTree(); bst.root = new Node(10); bst.root.left = new Node(6); bst.root.left.left = new Node(4); bst.root.left.left.left = new Node(3); bst.root.left.left.right = new Node(5); bst.root.left.right = new Node(8); bst.root.left.right.left = new Node(7); bst.root.left.right.right = new Node(9); bst.root.right = new Node(12); bst.root.right.left = new Node(11); bst.root.right.right = new Node(13); bst.root.right.right.right = new Node(14); bst.root.right.right.right.right = new Node(18); bst.root.right.right.right.right.left = new Node(16); bst.root.right.right.right.right.right = new Node(21); bst.root.right.right.right.right.left.left = new Node(15); bst.root.right.right.right.right.left.right = new Node(17); // 10 // / \ // 6 12 // / \ / \ // 4 8 11 13 // / \ / \ \ // 3 5 7 9 14 // \ // 18 // / \ // 16 21 // / \ // 15 17 var data10 = bst.FindNextSuccessor(10); var data8 = bst.FindNextSuccessor(8); var data9 = bst.FindNextSuccessor(9); var data4 = bst.FindNextSuccessor(4); var data11 = bst.FindNextSuccessor(11); var data14 = bst.FindNextSuccessor(14); var data15 = bst.FindNextSuccessor(15); var data16 = bst.FindNextSuccessor(16); var data17 = bst.FindNextSuccessor(17); var data18 = bst.FindNextSuccessor(18); var data21 = bst.FindNextSuccessor(21); var data22 = bst.FindNextSuccessor(22); Console.WriteLine("Successor of 10 -->; " + data10); Console.WriteLine("Successor of 8 -->; " + data8); Console.WriteLine("Successor of 9 -->; " + data9); Console.WriteLine("Successor of 4 -->; " + data4); Console.WriteLine("Successor of 11 -->; " + data11); Console.WriteLine("Successor of 14 -->; " + data14); Console.WriteLine("Successor of 15 -->; " + data15); Console.WriteLine("Successor of 16 -->; " + data16); Console.WriteLine("Successor of 17 -->; " + data17); Console.WriteLine("Successor of 18 -->; " + data18); Console.WriteLine("Successor of 21 -->; " + data21); Console.WriteLine("Successor of 22 -->; " + data22); } public class Node { public int key; public Node left; public Node right; public Node(int _key) { key = _key; left = right = null; } }