解法一(这种解法对于数据较多时可能会超时):
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
//寻找共同祖先结点则首先需要有一个找父结点的函数
public TreeNode findFatherNode(TreeNode root, TreeNode t){
if(root == null) return null;
if(root == t) return null;
if(root.left == t) return root;
if(root.right == t) return root;
TreeNode l = findFatherNode(root.left, t);
TreeNode r = findFatherNode(root.right, t);
if(l != null) return l;
else if(r != null) return r;
else return null;
}
//采用两层循环,p结点在外层循环,q结点在内层循环,产生思路是父结点可以是两个结点的LCA,所以两个结点分别一层一层向上找父结点
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
TreeNode tempP = p;
TreeNode tempQ = q;
while(tempP != null && tempP != tempQ){
while(tempQ != null && tempP != tempQ){
//System.out.println("tempQ:" + tempQ.val);
tempQ = findFatherNode(root, tempQ);
}
if(tempP == tempQ) return tempP;
//System.out.println("tempP:" + tempP.val);
tempP = findFatherNode(root, tempP);
tempQ = q;
}
return tempP;
}
}
本文介绍了一种求解二叉树中两个节点最低公共祖先(LCA)的方法。该方法通过寻找每个节点的父节点,并使用双层循环来确定公共祖先。
414

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



