【leetcode】285. 二叉搜索树中的顺序后继

给你一个二叉搜索树和其中的某一个结点,请你找出该结点在树中顺序后继的节点。

结点 p 的后继是值比 p.val 大的结点中键值最小的结点。

思路

一开始我是按照寻找找某节点的后继去写的

class Solution {
   
public:
    TreeNode* inorderSuccessor(TreeNode* root, TreeNode* p) {
   
        if (p->right) {
   
            p = p->right;
            while (p->left) p = p->left;
            return p;
        }
        stack<TreeNode*>s;
        s.push(nullptr);
        TreeNode* cur = root;
        while(cur != p) {
   
            if (p->val < cur->val) {
   
                s.push(cur);
                cur = cur->left;
            } else {
   
                s.push(cur);
                cur = cur->right;
            }
        }
        while (s.top() != nullptr && s.top()->right== p) {
   
            p = s.top();
            s.pop();
        }
        return s.top();
    }
};

很长,也比较慢

后来看别人的代码,是这样写的

class Solution {
   
public:
    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;
    }
};

直接根据二叉搜索树的性质去寻找的最大最小的节点。
感觉是二分查找,分治的思想。
凡是p->val < cur->val , 那么cur 就是一个可行的解。

全部评论

相关推荐

04-02 16:49
门头沟学院 Java
_bloodstream_:我也面了科大讯飞,主管面的时候听说急招人优先考虑能尽快实习的,我说忙毕设,后面就一直没消息了
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务