题解 | #二叉搜索树的最近公共祖先#(后序遍历-返回查找节点的值)

二叉搜索树的最近公共祖先

http://www.nowcoder.com/practice/d9820119321945f588ed6a26f0a6991f

普通二叉树查找最近公共祖先

公共祖先 --- 后序遍历

递归左子树 和 递归右子树

如果找到指定需要的节点值p,q, 就返回该节点值,代表该子树有该值 如果没有找到在另一个子树中查找。 如果在两个子树中都找则代表为父亲节点直接返回

class Solution {
public:
    int lowestCommonAncestor(TreeNode* root, int p, int q) {
        // write code here
        return order(root, p, q)->val;
    }
    TreeNode* order(TreeNode* root, int p, int q){
        if(!root || root->val == p || root->val == q) return root;
        TreeNode* left = order(root->left, p, q);
        TreeNode* right = order(root->right, p, q);
        if(left == NULL) return right;
        if(right == NULL) return left;
        return root;
    }
};

二叉搜索树

增加节点判断条件 加快递归过程


class Solution {
public:
    int lowestCommonAncestor(TreeNode* root, int p, int q) {
        // write code here
        return order(root, p, q)->val;
    }
    TreeNode* order(TreeNode* root, int p, int q){
        if(!root || root->val == p || root->val == q) return root;
        TreeNode* left = order(root->left, p, q);
        TreeNode* right = order(root->right, p, q);
        if(root->val > p && root->val > q) return left;
        if(root->val < p && root->val < q) return right;
        return root;
    }
};

非递归

查找两个节点所有父亲节点 然后顺序比较最后一个相同的父亲节点即为公共祖先

class Solution {
public:
    /**
     
        
     */
    int lowestCommonAncestor(TreeNode* root, int p, int q) {
        // write code here
        int ans;
        vector<int> path1 = getPath(root, p);
        vector<int> path2 = getPath(root, q);
        for(int i = 0; i < path1.size() && i < path2.size(); i++){
            if(path1[i] == path2[i]) ans = path1[i];
            else break;
        }
        return ans;
    }
    vector<int> getPath(TreeNode* root, int target){
        TreeNode* node = root;
        vector<int> path;
        while(node){
            path.push_back(node->val);
            if(node->val == target) break;
            else if(node->val < target) node = node->right;
            else node = node->left;
        }
        return path;
    }
};
全部评论

相关推荐

不愿透露姓名的神秘牛友
06-19 20:55
因为业务不是喜欢的,所以就没去,现在实习工作也有很多dirtywork,很后悔,怎么能舔回这个offer啊
flmz_Kk:试一试跟hr舔回来,不过保不齐米的活也有很多dirtywork,只能说不要美化自己没走过的路
点赞 评论 收藏
分享
迷茫的大四🐶:自信一点,我认为你可以拿到50k,低于50k完全配不上你的能力,兄弟,不要被他们骗了,你可以的
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-19 17:02
鼠鼠深知pdd的强度很大,但是现在没有大厂offer,只有一些不知名小厂我是拒绝等秋招呢,还是接下?求大家帮忙判断一下!
水中水之下水道的鼠鼠:接了再说,不图转正的话混个实习经历也不错
投递拼多多集团-PDD等公司10个岗位 >
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务