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. 二叉树的最近公共祖先]的主要内容,如果未能解决你的问题,请参考以下文章