Algo#1: Inorder Predecessor in Binary Tree


Algo#1: Inorder Predecessor in Binary Tree
Step 1: Current root itself is NULL, then predecessor is also NULL.
Step 2: Current root contains value same as key for which we are looking predecessor.
        2.1: Current root has left child, then right most node of left child is predecessor.
        2.2: Current root doesn't has left child, then parent of current root is predecessor.
Step 3: Current root is not the target node for which we are looking predecessor.
        3.1: Search target node and its predecessor in left side of tree recursively, and return if found.
        3.2: Search target node and its predecessor in right side of tree recursively, and return.
Node *findRightMostNode(Node *root)
017{
018    while (root->right)
019        root=root->right;
020    return root;
021}
022
023Node *inorderPredecessorRec(Node *root, int key, Node *parent)
024{
025    //Case 1: Current root  itself is NULL, then predecessor is also NULL.
026    if (root==NULL)
027        return 0;
028    //Case 2: Current root  contains value same as key for which we are looking predecessor.
029    if (root->data == key)
030    {
031        //Case 2.1: Current root has left child, then right most node of left child is predecessor.
032        if (root->left)
033            return findRightMostNode(root->left);
034        //Case 2.2: Current root  doesn't has left child, then parent of current root is predecessor.
035        else
036            return parent;
037    }
038    //Case 3: Current root  is not the target node for which we are looking predecessor.
039    else
040    {
041     //Case 3.1: Search target node and its predecessor in left side of tree recursively, and return if found.
042        Node *left=inorderPredecessorRec(root->left,key,parent);
043        if (left)
044            return left;
045        //Case 3.2: Search target node and its predecessor in right side of tree recursively, and return.
046        return inorderPredecessorRec(root->right,key,root);
047    }
048}

Algo#2: Inorder Successor in Binary Tree
Also http://massivealgorithms.blogspot.com/2015/09/inorder-predecessor-and-successor-for.html

Algo#3: Postorder Predecessor in Binary Tree
Step 1: If current root is NULL, then pred(current root) is NULL.
Step 2: If current root is target node for which we are looking for predecessor.
        2.1: If current root has a right child, r, then pred(current root) is r.
        2.2: Otherwise If current root has a left child, l, then pred(current root) is l.
        2.3: Otherwise if current root has a left sibling, ls, then pred(current root) is ls
      2.4: Otherwise if current root has an ancestor, v, which is a right child and has a left sibling, vls, then pred(current root) is vls
        2.5: Otherwise, pred(current root) is undefined.
Step 3: Current root is not the target node for which we are looking predecessor.
        3.1: Search target node and its predecessor in left side of tree recursively, and return if found.
        3.2: Search target node and its predecessor in right side of tree recursively, and return.
Node *postorderPredecessorRec(Node *root, int key,Node *direct_parent, Node *parent,Node * ance_leftsib)
019{
020    //Case 1: If current root is NULL, then pred(current root) is NULL.
021    if (root==NULL)
022        return 0;
023    //Case 2: If current root is target node for which we are looking for predecessor.
024    if (root->data == key)
025    {
026        //Case 2.1: If current root has a right child, r, then pred(current root) is r.
027        if(root->right)
028            return root->right;
029        //Case 2.2: Otherwise If current root has a left child, l, then pred(current root) is l.
030        if(root->left)
031            return root->left;
032        //Case 2.3: Otherwise if current root has a left sibling, ls, then pred(current root) is ls
033        else if(direct_parent != NULL && direct_parent->left!=NULL && direct_parent->left!=root )
034            return direct_parent->left;
035        //Case 2.4: Otherwise if current root has an ancestor, v, which is a right child and has a left sibling, vls, then pred(current root) is vls
036        else if(parent != NULL && parent->left==ance_leftsib && ance_leftsib!=NULL)
037            return ance_leftsib;
038        //Case 2.5: Otherwise, pred(current root) is undefined.
039        else
040            return NULL;
041    }
042    //Case 3: Current root is not the target node for which we are looking predecessor.
043    else
044    {
045        //Case 3.1: Search target node and its predecessor in left side of tree recursively, and return if found.
046        Node *left=postorderPredecessorRec(root->left,key,root,parent,ance_leftsib);
047        if (left)
048            return left;
049        //Case 3.2: Search target node and its predecessor in right side of tree recursively, and return.
050        //TRICK:
051        if(root->left)
052         return postorderPredecessorRec(root->right,key,root,root,root->left);
053        else
054         return postorderPredecessorRec(root->right,key,root,parent,ance_leftsib);
055    }
056}

Algo#4: Postorder Successor in Binary Tree
Step 1: If current root is NULL, then succ(current root) is NULL.
Step 2: If current root is target node for which we are looking for successor.
        2.1: If current root is the root of the tree, succ(current root) is undefined.
        2.2: Otherwise, if current root is a right child, succ(current root) is parent(current root).
        2.3: Otherwise current root is a left child and the following applies:
           2.3.1: If u has a right sibling, r, succ(current root) is the leftmost leaf in r's sub-tree
           2.3.2: Otherwise succ(current root) is parent(current root).
           2.3.3: If none of above applies, then succ(current root) doesn't exist.
Step 3: Current root is not the target node for which we are looking predecessor.
        3.1: Search target node and its predecessor in left side of tree recursively, and return if found.
        3.2: Search target node and its predecessor in right side of tree recursively, and return.
015Node *leftmostLEAFnotNODE(Node *root)
016{
017    while (root->left || root->right)
018    {
019        if(root->left) root=root->left;
020        else root=root->right;
021    }
022 
023    return root;
024}
025 
026Node *postorderSuccessorRec(Node *root, int key,Node *direct_parent, Node *parent,Node * treeroot)
027{
028    //Case 1: If current root is NULL, then succ(current root) is NULL.
029    if (root==NULL)
030        return 0;
031    //Case 2: If current root is target node for which we are looking for successor.
032    if (root->data == key)
033    {
034        //Case 2.1: If current root is the root of the tree, succ(current root) is undefined.
035        if(root == treeroot)
036            return NULL;
037        //Case 2.2: Otherwise, if current root is a right child, succ(current root) is parent(current root).
038        else if(direct_parent != NULL && direct_parent->right==root)
039            return direct_parent;
040        //Case 2.3: Otherwise current root is a left child and the following applies:
041 
042        //Case 2.3.1: If u has a right sibling, r, succ(current root) is the leftmost leaf in r's sub-tree
043        else if(direct_parent != NULL && direct_parent->left==root && direct_parent->right!=NULL)
044            return leftmostLEAFnotNODE(direct_parent->right);
045        //Case 2.3.2: Otherwise succ(current root) is parent(current root).
046        else if(direct_parent != NULL && direct_parent->left==root && direct_parent->right==NULL)
047            return direct_parent;
048        //Case 2.3.3: If none of above applies, then succ(current root) doesn't exist.
049        else
050            return NULL;
051    }
052    //Case 3: Current root is not the target node for which we are looking successor.
053    else
054    {
055        //Case 3.1: Search target node and its successor in left side of tree recursively, and return if found.
056        Node *left=postorderSuccessorRec(root->left,key,root,root,treeroot);
057        if (left)
058            return left;
059        //Case 3.2: Search target node and its successor in right side of tree recursively, and return.
060        return postorderSuccessorRec(root->right,key,root,parent,treeroot);
061    }
062}
063 
064Node *postorderSuccessor(Node *root, int key)
065{
066    return postorderSuccessorRec(root,key,NULL,NULL,root);
067}


Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts