惊恐设计一个算法,找出二叉树中某两个结点的第一个公共祖先.。不得将额外的结点存储在另外的数据结构中。注意:这不一定是二叉查找树。


/*
*若p为root的子孙,则返回true
*/
boolean covers(TreeNode root,TreeNode p)
{
if(root==null) return false;
if(root== p) return true;
return covers(root.left,p)||covers(root.right,p);
}
    TreeNode commonAncestorHelper(TreeNode root,TreeNode p,TreeNode q)
    {
    if(root==null) return null;
    if(root == p || root == q) return root;
    boolean is_p_on_left=covers(root.left,p);
    boolean is_q_on_left=covers(root.left,q);
    /*
    * 若p和q不在同一边,则返回root
    */
    if(is_p_on_left!=is_q_on_left) return root;
    /*
    * 否则就在同一边,遍访那一边
    */
    TreeNode child_side=is_p_on_left?root.left:root.right;
    return commonAncestorHelper(child_side,p,q);
    }
TreeNode commonAncestor(TreeNode root,TreeNode p,TreeNode q)
{
if(!covers(root,p)||!covers(root,q))//错误检查
{
return false;
}
return commonAncestorHelper(root,p,q);
}


更多推荐