笔试程序题专项----二叉树中两个节点的最低公共祖先节点和距离

//求两个结点的最低公共祖先最低公共祖先,即 LCA(Lowest Common Ancestor)//
//复杂性和 n 同样数量级 
BTree FindLCA(BTree T, BTree target1, BTree target2)
{
    if (T == NULL)
        return NULL;
    //cout<<"vist"<<T->data<<endl;    
    if (T == target1 || T == target2)
        return T;
  
    BTree left = FindLCA(T->lchild, target1, target2);
    BTree right = FindLCA(T->rchild, target1, target2);
    if (left && right)  // 分别在左右子树
        return T;
  
    return left ? left : right;  // 都在左子树或右子树
}
 
//10 求任意两结点距离
//首先找到两个结点的 LCA,然后分别计算 LCA 与它们的距离,最后相加即可。
 
int FindLevel(BTree node, BTree target)
{
    if (node == NULL)
        return -1;
    if (node == target)
        return 0;
  
    int level = FindLevel(node->lchild, target);  // 先在左子树找
    if (level == -1)
        level = FindLevel(node->rchild, target);  // 如果左子树没找到,在右子树找
  
    if (level != -1)  // 找到了,回溯
        return level + 1;
  
    return -1;  // 如果左右子树都没找到
}
 
int DistanceNodes(BTree node, BTree target1,BTree target2)
{
    BTree lca = FindLCA(node, target1, target2);  // 找到最低公共祖先结点
    int level1 = FindLevel(lca, target1); 
    int level2 = FindLevel(lca, target2);
  
    return level1 + level2;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值