题目地址: https://leetcode-cn.com/problems/er-cha-shu-de-zui-jin-gong-gong-zu-xian-lcof/submissions/
终止条件:
- 当到达叶子节点并未找到值则直接返回null
- 当root等于p或q,直接返回root
后序遍历
返回值:
- 当left和right同时为null的时候,说明无符合条件的值,返回ull
- 当left和right同时不为null的时候,说明p,q分布在root的左子树和右子树中,返回root
- 当left为null,right不为null:p,q都不在root的左子树中,直接返回right。
- 当right为null,left不为null:直接返回left,同3.
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root == null) return root;
//查找最近公共节点 二叉树中无重复节点
//后序遍历
//1.一个在左子树一个在右子树
//2.一个在其中一个的左子树或右子树中
return dfs(root, p, q);
}
public TreeNode dfs(TreeNode root, TreeNode p, TreeNode q){
if(root == null || p == root || q == root) return root;
TreeNode left = dfs(root.left, p, q); //遍历左子树
TreeNode right = dfs(root.right, p, q); //遍历右子树
if(left == null)
//左子树的结果为null,说明结果在右子树
return right;
else if(right == null)
//右子树的结果为null,说明结果在左子树
return left;
else
//左右子树均不为null
return root;
}
}