总的思路:
1.对于一棵二叉树而言,每一个结点都是一棵新的树。
2.二叉树的问题我们通常用递归的方式来写,对于递归而言,我们只需要尽可能全面的考虑一棵树中发生的事情,然后递归调用左树与右树就可以使这棵二叉树中所有的节点都有相同的操作。
那么接下来我们就对一棵树进行分析
第一种情况
第二种情况
第三种情况
第四种情况
代码如下
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
//递归结束条件
if(root==null){
return null;
}
//第一种情况
if(p==root||q==root){
return root;
}
//分别调用我的左右子树
TreeNode left=lowestCommonAncestor(root.left,p,q);
TreeNode right=lowestCommonAncestor(root.right,p,q);
//若root.lchild!=null,则说明在root的左边找到了我们的一个节点,
//同理,如果root.rchild!=null,则说明在root的右边找到了我们的一个节点
//那么不就说明root是我们的公共祖先吗?
//第二种情况
if(left!=null&&right!=null){
return root;
}
第三种情况
if(left==null&&right!=null){
return right;
}
//第四种情况
if(left!=null&&right==null){
return left;
}
return null;
}
}