题解 | 最近公共祖先,向上标记法

二叉树

https://www.nowcoder.com/practice/5b80ab166efa4551844657603227caeb

这题目就是个裸的LCA(最近公共祖先)问题。 向上标记法,就是让两个结点分别检查自己的父节点是否是两者的公共祖先,如果不是,那么大家一起往上跳一层。不断重复这个过程,直到最终收敛到同一个点。(必然收敛,因为最差大家都跳到根节点) 因为这题数据比较弱,是一个完全二叉树,且数值是int范围的,说明最大深度不过30来层,随便跳。 如果题目范围更大,这一步跳的过程,我们是可以用倍增来加速的,如果想要用倍增法加速,那么就需要预处理出每个结点跳2i2^i步之后的祖先结点,不过没必要,所以这里略过。

利用完全二叉树的性质,x/2x / 2就是x的父节点,所以省去构造指针指向父节点的步骤。 然后我们先令两个结点同时跳到同一深度,然后大家再一起往上跳。

#include <iostream>
#include <cmath>

using namespace std;

int main() 
{
    auto get_depth = [&] (int x) -> int { return log2(x); };

    int x, y;
    while (scanf("%d%d", &x, &y) != EOF)
    {
        if (get_depth(x) < get_depth(y))
            swap(x, y);
        
        while (get_depth(x) != get_depth(y))
            x >>= 1;
        while (x != y)
            x >>= 1, y >>= 1;
        printf("%d\n", x);
    }
    return 0;
}
全部评论

相关推荐

董春花_:真诚无罪,别听评论区那个清华的。按他的逻辑,你有分寸人觉得你是不想来,你积极热情人觉得你太想来,你好骗人就可你养鱼,你不好骗人觉得你服从性不高,合着**做啥都白扯。保持谦逊礼貌与对offer的积极性不才是最正常,也正确的做法么?招聘方的错强加到应聘者身上,***何不食肉糜。
点赞 评论 收藏
分享
面试了几家,全程问项目,八股一点都不问,可惜准备了这么久
独角仙梦境:现在感觉问八股像是中场休息一样的,问几个八股放松一下再上强度
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务