找出二叉树中某两个结点的第一个公共祖先
设计一个算法,找出二叉树中某两个结点的第一个公共祖先.。不得将额外的结点存储在另外的数据结构中。注意:这不一定是二叉查找树。
/*
*若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);
}
更多推荐


所有评论(0)