给定一个二叉树, 找到该树中两个指定节点的最近公共祖先

//包含自身也算祖先
//有三种情况:  1.一个结点在左子树,另一个结点在右子树(公共祖先是root)
            //2.两个结点都在左子树或者都在右子树
            //3.其中有个结点是root(公共祖先则是root)
 //因为题中已经说明有树,所以不考虑root为null情况 

 public TreeNode lowestcommomAncestor(TreeNode root, TreeNode p, TreeNode q){
    if(root == p || root == q){  //其中有个结点是root,则公共祖先是root
        return root;
    }
    boolean pInLeft = search(root.left, p);//判断p和传进去的某个结点的引用是否相等,不是和具体的值相等
    boolean qInLeft = search(root.left, q);
    if(pInLeft && qInLeft){    //两个结点都在左子树
        return lowestcommomAncestor(root.left,p,q);
    }
    if(!pInLeft && !qInLeft){  //两个结点都在右子树
        return lowestcommomAncestor(root.right,p,q);
    }
    return root;  //一个结点在左子树,一个结点在右子树,公共祖先是root
}
public boolean search(TreeNode root, TreeNode n){  //等于就是n和root是同一个结点
    if(root == null){
        return false;
    }
    if(root == n){
        return true;
    }
    if(search(root.left, n)){
        return true;
    }
    return search(root.right, n);
}          

 

你可能感兴趣的:(给定一个二叉树, 找到该树中两个指定节点的最近公共祖先)