
一、二叉树的最近共同祖先


二、思路分析
方法一:递归法
判空
- 如果根节点为空,直接返回 null
- 如果当前节点是 p 或者 q,那么这个节点就是最近公共祖先
递归
- 分别遍历当前节点的左子树和右子树,找到 p 和 q 的最近公共祖先,存于 TreeNode leftRet 或者 TreeNode rightRet
结果
- 如果左右子树都找到,那么当前节点就是 p 和 q 的最近公共祖先
- 如果左子树找到,那就返回左子树的结果;
- 如果右子树找到,那就返回右子树的结果;

方法二:栈存路径法
获取路径
通过深度优先搜索,分别找到从根节点到 p 和 q 的路径中所有节点,并分别存入两个栈中
对齐栈长度
比较两个栈中元素长度,将较长的栈中元素弹出,然后比较两个栈中的下一深度元素是否相等
找公共祖先
同时弹出两个栈中不相等的栈顶元素,第一个相同的节点就是最近公共祖先

三、代码展示
方法一:递归法
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
(root == ) {
;
}
(root == p || root == q) {
root;
}
lowestCommonAncestor(root.left, p, q);
lowestCommonAncestor(root.right, p, q);
(leftRet != && rightRet != ) {
root;
}
(leftRet != ) {
leftRet;
} {
rightRet;
}
}


