leetcode [236. 二叉树的最近公共祖先]

Posted BeicC

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode [236. 二叉树的最近公共祖先]相关的知识,希望对你有一定的参考价值。

(https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/)

自己写这一题墨迹那么长时间最后还是选了一个超级暴力的方法,不仅代码长,而且很慢.....

具体思路就是进行在对树进行后序遍历的时候,对每个点进行一次深搜,如果以该点为根节点的树中恰好含有p和q,那么这个点就是答案,因为后序遍历的性质就是从下往上进行遍历的。

class Solution {
public:
    TreeNode *ans,*p1,*q1;
    int num;
    bool flag;
    bool check(TreeNode* root){ //用来检查以这个点为根节点的树是否同时含有p和q
        num = 0;
        dfs2(root);
      //  cout<<num<<" ";
        if(num == 2) return true;
        return false;
    }
    void dfs2(TreeNode* root){
        if(root->val == p1->val || root->val == q1->val) num++;
        if(root->left) dfs2(root->left);
        if(root->right) dfs2(root->right);
    }
    void dfs(TreeNode* root){//进行后序遍历
        if(root->left && flag == false) dfs(root->left);
        if(root->right && flag == false) dfs(root->right);
        if(check(root) && flag == false) {ans = root;flag = true;}
    }
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        q1 = q; p1 = p;
        flag = false;
        dfs(root);
        return ans;
    }
};

在写一下别人的思路:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/solution/236-er-cha-shu-de-zui-jin-gong-gong-zu-xian-hou-xu/ ,这个递归用的妙啊,最终答案无非就是两种情况,p和q其中一个为根节点,另一个在以这个点为根节点的树上;或者p和q在两个不同的子树上。具体看题解中的ppt比较好理解,我觉得现在的我是写不出来(菜

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(root == NULL || root == p || root == q) return root;
        TreeNode* left = lowestCommonAncestor(root->left,p,q);
        TreeNode* right = lowestCommonAncestor(root->right,p,q);
        if(left == NULL) return right;
        if(right == NULL) return left;
        return root;
    }
};

总结:有一个思路就紧抓着这个思路写下去,尽管它的效率很差,最起码先写出来之后在考虑优化问题,不要在几种方法之间来回摇摆,不然到最后都写不出来..

以上是关于leetcode [236. 二叉树的最近公共祖先]的主要内容,如果未能解决你的问题,请参考以下文章

leetcode 236 二叉树的最近公共祖先

LeetCode236. 二叉树的最近公共祖先

leetcode-236二叉树的最近公共祖先

Leetcode 236.二叉树的最近公共祖先

leetcode 236. 二叉树的最近公共祖先

LeetCode Java刷题笔记—236. 二叉树的最近公共祖先