二叉树:找最近的公共祖先

TreeNode *Find(TreeNode *pRoot,TreeNode *pNode)
{
    if(pRoot == NULL){
        return NULL;
    }
    
    if(pRoot == pNode){
        return pRoot;
    }

    TreeNode *pFound = Find(pRoot->pLeft,pNode);
    if(pFound != NULL){
        return pFound;
    }

    return Find(pRoot->pRight,pNode);
}

TreeNode *FindLowestAncestor(TreeNode *pRoot,TreeNode *n1,TreeNode *n2)
{
    //在左子树中找 n1
    TreeNode* pN1LeftFound = Find(pRoot->pLeft,n1);
    //在左子树中找 n2
    TreeNode* pN2LeftFound = Find(pRoot->pLeft,n2);
    //在右子树中找 n1
    TreeNode* pN1RightFound = Find(pRoot->pRight,n1);
    //在右子树中找 n2
    TreeNode* pN2RightFound = Find(pRoot->pRight,n2);

    /* 四种情况:
       1.n1 和 n2 都在一棵子树中
       2.n1 和 n2 不在一棵子树中
       3.n1 或 n2 一个是根(pRoot),另一个在一棵子树中
       4.n1 或 n2 有一个没找到 
    */

    if(pN1LeftFound!=NULL&&pN2LeftFound!=NULL){
        //n1 和 n2 都在左子树中
        return FindLowestAncestor(pRoot->pLeft,n1,n2);
    }

    if(pN1RightFound!=NULL&&pN2RightFound!=NULL){
        //n1 和 n2 都在右子树中
        return FindLowestAncestor(pRoot->pRight,n1,n2);
    }    

    if(pN1LeftFound!=NULL&&pN2RightFound!=NULL){
        //n1 在左子树中,n2 在右子树中
        return pRoot;
    }

    if(pN1RightFound!=NULL&&pN2LeftFound!=NULL){
        //n1 在右子树中,n2 在左子树中
        return pRoot;
    }

    if(n1==pRoot&&(pN2LeftFound||pN2RightFound)){
        //n1 是根结点,n2 在一棵子树中
        return pRoot;
    }

    if(n2==pRoot&&(pN1LeftFound||pN1RightFound)){
        //n2 是根结点,n1 在一棵字数中
        return pRoot;
    }
        return NULL;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值