


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

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

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



