Inorder Successor in BST
Given a binary search tree and a node in it, find the in-order successor of that node in the BST.
Note: If the given node has no in-order successor in the tree, return
null
.
o(h) time, o(1) space.
If root->val > p->val, root is a possible successor of p, move to root->left
otherwise do not change successor, move to root->right.
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: TreeNode* inorderSuccessor(TreeNode* root, TreeNode* p) { TreeNode * succ = nullptr; while(root != nullptr){ if(root->val > p->val){ succ = root; root = root->left; }else{ root = root->right; } } return succ; } };
This general solution can find the successor of a binary tree node.
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: TreeNode* inorderSuccessor(TreeNode* root, TreeNode* p) { //extreme condition if(p == NULL || root == NULL) return NULL; //find next successor if(p->right != NULL){ p = p->right; while(p->left != NULL){ p = p->left; } return p; } else{ //p is root and has no right child if(p == root) return NULL; //find parent of p TreeNode * parent = findParent(root, p); //if p is left child of parent, return parent, else return NULL while(parent->right == p && parent != root){ p = parent; parent = findParent(root, p); } if(parent->left == p) return parent; else return NULL; } } TreeNode * findParent(TreeNode * root, TreeNode * p){ //base case if(root == NULL) return NULL; if(root->left == p || root->right == p){ return root; } TreeNode * q1 = findParent(root->left, p); TreeNode * q2 = findParent(root->right, p); return q1 == NULL? q2: q1; } };