思路:
● 二叉树类的问题一般是通过递归的方式去解决
● 判断当前节点是否为公共祖先必须得向下递归去找,并利用递归回溯的结果进行判断
● 注意这里的最近祖先从上往下回溯时是从近到远回溯判断的,所以一定是最近祖先
● 这里是否为公共祖先的判断存在两种情况 1. 左右子树包括目标节点 2. 其中一子树包括,另外的子节点为本身
代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
// 同一层的找上层最近的公共祖先
/*
思路: 回溯返回标志位, 保存公共祖先
树类型的题目一般都是用递归解决
不同层:
1. 有见解父子关系
*/
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;
// 当前节点左右子树是否存在,这里不需要讨论左右子树都存在一个节点的情况
boolean left=dfs(root.left,p,q);
boolean right=dfs(root.right,p,q);
//当前节点左右子树都包括,或者是当前节点就是其中一个节点,另一个节点为子节点,则找到目标节点
if( (left&&right) || ( (left||right) && (root.val==p.val||root.val==q.val))){
ans=root;
}
return left||right||root.val==q.val||root.val==p.val;
}
}