深度优先查找
一开始就是普通递归,然后找到之后进行分条件的判断
就三种情况,
- 当前结点root的左右两个结点为p、q,则当前结点就是最近公共祖先结点
- 当前结点为p,那么p即当前结点为最近公共祖先结点
- 当前结点为q,那么q即当前结点为最近公共祖先结点
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
/** 递归终止的边界为 当前结点为空,或者当前结点为p,或者q
* =找到之后,就直接返回该结点*/
if (root == null || root == p || root == q) return root;
/** 深度优先,不断的往左和右下面去寻找*/
/** 问题与子问题间的关系
* 如果左边找到了,右边却没有找到,就直接返回找到的左边的结点,反之,
* 如果左边和右边都找到了,就返回当前结点*/
TreeNode left = lowestCommonAncestor(root.left, p, q);
TreeNode right = lowestCommonAncestor(root.right, p, q);
/**如果在某个为值找到了(也就是不在进行递归,深度优先查找找到头了)要么找到left,要么找到right 或者 都找到了,就刚好对应着以上的三种情况*/
/**然后向上返回 最近公共结点*/
if (left != null && right != null){
return root;
}else if (left != null){
return left;
}else {
return right;
}
}