两个树结点的公共祖先



这棵树的前序遍历结果是:1 2 4 0 0 5 0 0 3 6 0 8 0 0 7 0 0

前序建立二叉树:

void buildTree(Node *&root)
{
    int num;
    scanf("%d",&num);
    if(num==0)
    {
        root=NULL;
        return;
    }    
    root=new Node;
    root->data=num;
    buildTree(root->lchild);
    buildTree(root->rchild);
}



Node *getPublicParetnNode(Node *root,int n1,int n2)

{
    if(root==NULL) return NULL;
    
    if(root->data==n1||root->data==n2)
    return root;//返回当前结点的原因是我们找到了要找的子结点,在回传的过程中两个结点会聚到一起,返回。
    
    Node *lNode=getPublicParetnNode(root->lchild,n1,n2);
    Node *rNode=getPublicParetnNode(root->rchild,n1,n2);
    
    if(!lNode&&!rNode) return NULL;
    else if(lNode&&rNode) return root;

    else return lNode==NULL?rNode:lNode;

}


//这个算法 考虑不全面,只是考虑到了 两个结点都在树中的情况,如果  一个结点没有在树中  就出错了




//=========================二叉树中两个节点的最低祖先结点========================================
/*
查找二叉树中两个节点的最低祖先节点(或最近公共父节点等)
如果给定pRoot是NULL,即空树,则返回的公共节点自然就是NULL;
如果给定pRoot与两个节点中任何一个相同,说明,pRoot在就是所要找的两个节点之一,则直接返回pRoot,
表明在当前链路中找到至少一个节点; 如果给定pRoot不是两个节点中任何一个,
则说明,需要在pRoot的左右子树中重新查找,此时有三种情况:

两个节点都在左子树上; 两个节点都在右子树上;一个在左子树,一个在右子树上;

具体来说,就是:
情况一:如果左子树查找出的公共节点是NULL,则表明从左子树根节点开始到左子树的所有叶子节点等所有节点中,
        没有找到两个节点中的任何一个,这就说明,这两个节点不在左子树上,不在左子树,则必定在右子树上;
        
情况二:如果右子树查找的公共节点是NULL,说明在右子树中无法找到任何一个节点,则两个节点必定在左子树上;

情况三: 如果左右子树查找的公共节点都不是NULL,说明左右子树中各包含一个节点,
        则当前节点pRoot就是最低公共节点,返回就可以了。
        三种情况是互斥的, 只能是其中之一。
*/  
BiNode *get_comm_parent(BiNode *root,BiNode *node1,BiNode *node2)
{
    if(root==NULL) return NULL;
    if(root==node1||root==node2) return root;//表示这个顶点就是要找的公共点
    
    BiNode *lnode=get_comm_parent(root->lchild,node1,node2); //在左子树中查找是否有相应的结点
    BiNode *rnode=get_comm_parent(root->rchild,node1,node2); //在左子树中查找是否有相应的结点
    
    if(lnode==NULL)
    return rnode;
    
    
    if(rnode==NULL)
    return lnode;
    
    return root;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值