寻找二叉树两个结点的最低共同父节点(2014京东笔试题)

这道题小编提供两种方式进行解答:1.使用递归的思想;2.使用迭代的思想

1.使用递归的思想(从根节点自上向下查找,优点直观易懂,缺点使用较大内存)

思想:这种方法从根节点自上向下查找两个节点,直到找到为止

typedef struct BiTreeNode{
    int data;
    struct BiTreeNode *lchild,*rchild;
};

//寻找二叉树两个结点的最低共同父节点
BiTreeNode *FindCommonParentNode(BiTreeNode *pRoot,BiTreeNode *pNodeOne,BiTreeNode *pNodeTow){
    if(NULL==pRoot){
        return NULL;
    }
    //判断与pNodeOne或pNodeTow相等的节点位置  
    if(pRoot==pNodeOne||pRoot==pNodeTow){
        return pRoot;
    }
    //在左右子树中寻找与pNodeOne或pNodeTow相等的节点
    BiTreeNode *pLeft=FindCommonParentNode(pRoot->lchild,pNodeOne,pNodeTow);
    BiTreeNode *pRight=FindCommonParentNode(pRoot->rchild,pNodeOne,pNodeTow);
    
    if(NULL==pLeft){//在左子树没有找到相应的节点,那么目标必存在右子树中,并且最小的共同父节点是右子树的头结点
        return pRight;
    }else if(NULL==pRight){//在右子树中没有找到相应的节点,那么目标必存在左子树中,并且最小的共同父节点是左子树的头结点
        return pLeft;
    }else{//在左右子树都找到目标,说明pRoot就是要寻找的最小共同父节点
        return pRoot;
    }

}



2.使用迭代思想(从两目标节点自下向上查找,缺点运行较长时间,改进:可以牺牲内存记录找过的节点)

思路:这种方法从两个节点开始自下向上寻找共同父节点

typedef struct BinTreeNode{
    int data;
    struct BinTreeNode *lchild,*rchild,*parent;
};

//寻找二叉树两个结点的最低共同父节点
BinTreeNode *FindCommonParentNode2(BinTreeNode *pNodeOne,BinTreeNode *pNodeTow){
    assert(NULL!=pNodeOne&&NULL!=pNodeTow);
    BinTreeNode *pRootOne=pNodeOne,*pRootTow;
    while(pRootOne){
        pRootTow=pNodeTow;
        while(pRootTow){
            if(pRootTow==pRootOne){
                return pRootOne;
            }
            pRootTow=pRootTow->parent;
        }
        pRootOne=pRootOne->parent;
    }
    return pRootOne;
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值