这个题可太有意思了,我以前做的时候在笔记本上写着:此题会忘
从根节点到目标节点中间所有的节点都是祖先。如果是最近的公共祖先的话那么两个目标节点一定在根节点两边。
想象从叶子节点向上返回节点值。
如果有一个是目标节点,那向上返回这个节点。
如果两个都是目标节点,向上返回根节点
如果两个都不是,返回空。
特殊的判断,如果根节点是空,直接返回空,也不用判断它的左右子树了,它就是叶子节点。如果已经找到了目标节点,那就返回目标节点。
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&&right==null){
return null;
}
if(left==null){
return right;
}
if(right==null){
return left;
}
else {
return root;
}
}
就这样吧,希望不要再忘了