1、思路
-
根据二叉搜索树的性质,其中序遍历是单调递增的;
-
若当前节点值小于等于给定节点值,说明给定的节点在当前节点的右子树中;
-
若当前节点值大于给定节点值,则分两种情况讨论:
1、当前节点就是给定节点的后继者;
2、若当前节点存在左子树,则当前节点左子树中最左的节点才是给定节点的后继者。
2、代码
class Solution {
public:
TreeNode* inorderSuccessor(TreeNode* root, TreeNode* p) {
if (root == nullptr) return nullptr;
if (p->val >= root->val)
{
return inorderSuccessor(root->right, p); //递归查找右子树
}
else
{
auto left = inorderSuccessor(root->left, p); //查找最左节点
return left ? left : root; //若左子树存在则返回最左节点,否则返回当前节点
}
}
};
代码参考自: godweiyang的题解 。