首先利用自底向上的思路——如果遍历到当前节点是A/B中的任意一个,则向父节点汇报此节点,否则递归到节点为null时返回null值。
具体情况如下几种:
1.当前节点即为两个节点中的一个,此时直接向父节点返回当前节点;
2.递归到null,返回null;
3.当前节点不是两个节点中的一个,此时判断左右子树的返回结果:
。若左右子树均返回非空值,那么当前节点一定为所求节点,将当前节点逐层向上汇报。//两个节点分居树的两侧
。若左右子树只有一个返回非空值,则继续将此非空值向上层汇报。//节点仅存在于树的一侧
。若左右结点均返回null,继续向上层返回null。
注:此种解法若树中只有一个节点时会误判。
public class Solution {
public TreeNode LCA(TreeNode root,TreeNode first,TreeNode second) {
if(root == null||root == first||root == second){
return root;
}
TreeNode left=LCA(root.left,first,second);
TreeNode right=LCA(root.right,first,second);
if(left!=null&right!=null){
return root;
}else if(left!=null){
return left;
}else if(right!=null){
return right;
}else{
return null;
}
}
}