题目描述
给你一个二叉搜索树和其中的某一个结点,请你找出该结点在树中顺序后继的节点。
结点 p
的后继是值比 p.val
大的结点中键值最小的结点。
2
/ \
1 3
输入: root = [2,1,3], p = 1
输出: 2
解析: 这里 1 的顺序后继是 2。请注意 p 和返回值都应是 TreeNode 类型。
解题思路
这个题要和《剑指offer》上的“二叉树的下一个节点”区分开来。整体思路相似。
此题最容易想到的就是递归中序遍历法。
class Solution {
TreeNode *pPrev = nullptr;
TreeNode *pNext = nullptr;
public:
TreeNode* inorderSuccessor(TreeNode* root, TreeNode* p) {
if(!root || !p) return nullptr;
inorder(root, p);
return pNext;
}
void inorder(TreeNode* root, TreeNode *p){
if(!root) return;
inorder(root->left, p);
if(pPrev == p)
pNext = root;
pPrev = root;
inorder(root->right, p);
}
};
根据二叉搜索树的性质,迭代搜索(复杂度更低)
TreeNode* inorderSuccessor(TreeNode* root, TreeNode* p) {
TreeNode* res = NULL;
while (root) {
if (p->val < root->val) {
res = root;
root = root->left;
} else {
root = root->right;
}
}
return res;
}
参考代码
看上面