寻找二叉树中两个节点最近公共祖先(树)

在非二叉搜索树的场景下,为给定的两个节点p和q,如何高效地找到它们的最近公共祖先?这个问题涉及到二叉树的遍历和节点关系的分析。

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

 给定一颗二叉树和两个节点p和q,寻找它们的最近公共祖先?

说明这颗二叉树,不是一颗二叉搜索树。

节点typedef struct _node{
    int val;
    node * pleft;
    node * pright;
}node;

/*
先在一颗子树中找个某个节点是否存在
例如:t这个颗子树下是否存在p这个节点
*/
bool find_node(node *t, node *p)
{
    //如果这颗子树已遍历完,都不存在,或者传入的子树就为空
    if (!t)
        return false;

    //找到这个节点
    if (t == p)
        return true;
    
    //先在左子树中找,不存在,再到右子树中找
    bool bfound = find_node(t->pleft, p);
    if(bfound)
        return true;

    return find_node(t->right, p);
}

node * find_public_parant(node* t, node*p, node*q)
{
    //如果传入的子树节点为空,那么直接返回空,不存在
    if (!t )
        return NULL;

    //有可能,p,q其中一个就等于根节点 
    if (t == p || t == q)
        return t;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

byte_knight

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值