二叉树的最近公共祖先
题目描述
解题思路
- 确定递归函数返回值以及参数
 
需要递归函数返回值,来告诉我们是否找到节点q或者p,那么返回值为bool类型就可以了。
但我们还要返回最近公共节点,可以利用上题目中返回值是TreeNode * ,那么如果遇到p或者q,就把q或者p返回,返回值不为空,就说明找到了q或者p。
- 确定终止条件
 
如果找到了 节点p或者q,或者遇到空节点,就返回。
- 确定单层递归逻辑
 
值得注意的是 本题函数有返回值,是因为回溯的过程需要递归函数的返回值做判断,但本题我们依然要遍历树的所有节点。如果left 和 right都不为空,说明此时root就是最近公共节点。这个比较好理解
如果left为空,right不为空,就返回right,说明目标节点是通过right返回的,反之依然。
 
// 递归法public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {// 找到了直接返回if (root == p || root == q || root == null) {return root;}TreeNode left = lowestCommonAncestor(root.left, p, q);TreeNode right = lowestCommonAncestor(root.right, p, q);if (left == null && right != null) return right;else if (left != null && right == null) return left;else if (left != null && right != null) return root;return null;}
注意这种特殊情况
在root == 5的好时候已经不在递归,最后还是返回的是5.
