//这个题目的二叉树是普通的二叉树,没有规律,因此理论上这两个节点在哪我们不知道。只能遍历查找到节点,
//如果找到了就返回那个节点,到底也没找到就返回null,最后递归完回来时在每层都判断是否符合。
按照这个思路,如果他们的祖先节点是p、q中的一个,它被return到上一层了,此时其他的路都是null,所以最终应该返回它。
如果他们的祖先节点不是p、q中的一个,p、q被返回到上层时,总有一层会有节点捕获到左右节点同时不为null,返回这个节点。再往上层走,其他路都为null,因此最终得到的结果就是这个节点。
/**
* 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) {
//这个题目的二叉树是普通的二叉树,没有规律,因此理论上这两个节点在哪我们不知道。只能遍历查找到节点,
//如果找到了就返回那个节点,到底也没找到就返回null,最后递归完回来时在每层都判断是否符合。
if(root==null || root==p || root==q){
return root;
}
TreeNode left = lowestCommonAncestor(root.left,p,q);
TreeNode right = lowestCommonAncestor(root.right,p,q);
//递归完判断环节:
//某一层判断成功了,往上一层就变成左右一边有值,另一边没值了,可以使用下面的方法来返回值。
//如果没找到,那么另一个也是null,返回null也对。
if(left==null){
return right;
}
if(right==null){
return left;
}
//两边都有值那么最终结果就是root,返回这个root。
return root;
}
}