思路:通过递归对二叉树进行后序遍历,当遇到节点 p 或 q 时返回。从底至顶回溯,当节点 p, q 在节点 root的异侧时,节点 root 即为最近公共祖先,则向上返回 root
四种情况:
1.左子树没有找到pq,去右子树找
2.左子树找到了pq,去右子树看一下情况,如果右子树没找到,仍然去左子树找
3.左右子树都没为空,说明p和q分别在左右子树,返回root
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root == null) return null;
// 如果p和q中有等于root的,他们的最近公共祖先就是root
if(p == root || q == root) return root;
// 递归遍历左子树,只要在左子树中找到了p或q,则先找到谁就返回谁
TreeNode l = lowestCommonAncestor(root.left, p, q);
TreeNode r = lowestCommonAncestor(root.right, p, q);
// 如果在左子树中 p和 q 都找不到,则 p和 q一定都在右子树中,右子树中先遍历到的那个就是最近公共祖先(一个节点也可以是它自己的祖先)
if(l == null) return r;
// 如果左子树不为空,即在左子树找到了节点(p或q),这时候要判断一下右子树的情况,如果在右子树中,p和q都找不到,则 p和q一定都在左子树中
if(r == null) return l;
// 当 left和 right均不为空时,说明 p、q节点分别在 root异侧, 最近公共祖先即为 root
return root;
}
}