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
.
Example 1:
Input: root = [2,1,3], p = 1
2
/ \
1 3
Output: 2
Example 2:
Input: root = [5,3,6,2,4,null,null,1], p = 6
5
/ \
3 6
/ \
2 4
/
1
Output: null
Companies:
Amazon, Google, Microsoft, Palantir Technologies, Facebook
Related Topics:
Tree
Similar Questions:
// OJ: https://leetcode.com/problems/inorder-successor-in-bst/
// Author: github.com/lzl124631x
// Time: O(N)
// Space: O(logN)
class Solution {
private:
TreeNode *target, *ans = NULL;
bool seen = false;
void inorder(TreeNode *root) {
if (!root) return;
inorder(root->left);
if (seen && !ans) ans = root;
if (seen && ans) return;
if (root == target) seen = true;
inorder(root->right);
}
public:
TreeNode* inorderSuccessor(TreeNode* root, TreeNode* p) {
target = p;
inorder(root);
return ans;
}
};
Solution 1 doesn't take advantage of BST. Try to find the smallest number greater than p->val
.
// OJ: https://leetcode.com/problems/inorder-successor-in-bst/
// Author: github.com/lzl124631x
// Time: O(logN)
// Space: O(1)
// Ref: https://leetcode.com/problems/inorder-successor-in-bst/discuss/72721/10-(and-4)-lines-O(h)-JavaC%2B%2B
class Solution {
public:
TreeNode* inorderSuccessor(TreeNode* root, TreeNode* p) {
TreeNode *best = NULL;
while (root) {
root = root->val > p->val ? (best = root)->left : root->right;
}
return best;
}
};