二叉搜索树

面试题 04.06. 后继者

如果 p 大于当前节点的值,说明后继节点一定在右子树
如果 p 等于当前节点的值,说明后继节点一定在右子树
如果 p 小于当前节点的值,说明后继节点一定在左子树或自己就是
递归调用左树,如果是空的,说明当前节点就是答案,否则已在左树中找到答案

class Solution {
     
public:
    
    //寻找第一个大于p的节点
    TreeNode* inorderSuccessor(TreeNode* root, TreeNode* p) {
       
        if(!root) return NULL;
        if(p->val >= root->val) return inorderSuccessor(root->right, p);
        auto ans = inorderSuccessor(root->left, p);
        return ans? ans : root;
    }
};

突然想到这其实就是中序遍历。如果左树中存在一个大于p的节点即可直接返回。遍历开始先去左树中寻找,如果找到就返回,此时这个点必然是大于p节点最小的那个。找不到就取右树中找。

class Solution {
     
public:
    //寻找第一个大于p的节点
    TreeNode* inorderSuccessor(TreeNode* root, TreeNode* p) {
       
        if(!root) return NULL;
        auto res = inorderSuccessor(root->left, p);
        if(res) return res;
        if(root->val > p->val) return root;
        return inorderSuccessor(root->right, p);
    }
};

你可能感兴趣的:(算法,数据结构,二叉树,leetcode)