
//这个题目的二叉树是普通的二叉树,没有规律,因此理论上这两个节点在哪我们不知道。只能遍历查找到节点,
//如果找到了就返回那个节点,到底也没找到就返回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;
}
}
本文探讨了一种在普通二叉树中寻找两个节点最低公共祖先的递归算法,通过遍历和判断节点关系,确保在最短路径上捕获节点。重点讲解了如何利用节点状态判断和回溯来优化查找过程。
395

被折叠的 条评论
为什么被折叠?



