Leecode236
题目
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
分析
这道题,题目描述佷短,但是本体难度不小。 本体条件是在给定的树中找出两个节点的公共节点。没有特别要求。由定义分析可知:一个树中每个结点要么是p的祖先要么是q的祖先要么是p与q的共同祖先要么啥都不算的。所以可以想到使用递归的方法求出从根节点开始找其左右子树判断该子树的根是否为p或者q的祖先。
解法
根据分析出方法,可以想到一种递归的思路:若该树根节点是null则其属于既不是p的祖先也不是q的祖先。若该树根节点为左节点或者右节点,则该点就是其祖先。若该根的左右结点分别是p,q的祖先则该根就为最近的共同祖先。若该根结点的一个子节点为p或q的祖先另一个啥也不是则该根结点就同样也是p或q的祖先。
由此得到代码:
public class Solution
{
public TreeNode LowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q)
{
if(root == null)
{
return null;
}
if(root.val == p.val||root.val == q.val)
{
return root;
}
TreeNode l=LowestCommonAncestor(root.left,p,q);
TreeNode r=LowestCommonAncestor(root.right,p,q);
if(l==null)
{
return r;
}
if(r==null)
{
return l;
}
return root;
}
}
代码就是按照上面的思路将各个判别的条件区分写出。