目录
为了秋招刷题,来不及也得刷啊!
题目链接
自己的思路
哈哈,根本没思路!
正确答案
直接看答案。
什么时候说明这个节点是公共节点呢
两种情况
- 这个节点的左右子树各有一个p,q
- 这个节点等于p或q, 而另一个节点在他的左右子树中(这样才能确保公共节点尽可能深)
所以结合以上两点情况
if((lbool && rbool) || ((root.val == p.val || root.val == q.val) && (lbool || rbool ))){
ans = root;
}
这里就可以认定ans = 当前节点了
class Solution {
private TreeNode ans;
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
dfs(root, p, q);
return ans;
}
public boolean dfs(TreeNode root, TreeNode p, TreeNode q){
if(root == null)
return false;
//要注意当找到root等于p或q时,除非是空不然要往后找,因为可能这个节点是另一个节点的父节点
boolean lbool = dfs(root.left, p, q);
boolean rbool = dfs(root.right, p, q);
if((lbool && rbool) || ((root.val == p.val || root.val == q.val) && (lbool || rbool ))){
ans = root;
}
return root.val == p.val || root.val == q.val || lbool || rbool;
}
}
注意return只要返回当前这个节点是否是true就可以了,不用管ans.