树的最近公共祖先

本文介绍了一种在二叉搜索树中寻找两个节点最低公共祖先(LCA)的方法。通过比较当前节点与目标节点的值,算法可以高效地确定LCA的位置。如果当前节点值大于目标节点值,则LCA位于左子树;反之则位于右子树。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//如果是二叉搜索树的话,
//若当前节点t大于节点u,v,说明u,v的LCA在t的左节点中,故从t的左节点中继续查找
//若当前节点t小于节点u,v,说明u,v的LCA在t的右节点中,从t的右节点继续查找
//当找到一个节点满足u<t<v时,该节点就是u,v的LCA
//当t的一个节点的值等于u或v时,说明其中一个节点是另一个节点的父节点,返回t的父节点

struct TreeNode
{
    int value;
    TreeNode* left;
    TreeNode* right;
};

TreeNode* FindLCA(TreeNode u, TreeNode v, TreeNode* root)
{
    int left = u.value;
    int right = v.value;

    if (u.value > v.value)
    {
        left = v.value;
        right = u.value;
    }

    TreeNode* t = root;
    TreeNode* p = t;//保存当前节点的父节点
    while (true)
    {
        if (t->value < left)
        {
            p = t;
            t = t->right;
        }
        else if (t->value > right)
        {
            p = t;
            t = t->left;
        }
        else if (t->value == left || t->value == right)//一个节点为另一个节点的祖先,返回父节点的父节点
            return p;
        else
            return t;//left < t < right 
    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值