腾讯笔试编程题之满树中任意三个节点的公共祖先问题

#include <iostream>
using namespace std;

int main()
{
    int K;
    cin>>K;
    int a,b,c;
    cin>>a>>b>>c;

    //将输入的三个节点排序
    int temp;
    if(a>b)temp=a,a=b,b=temp;
    if(a>c)temp=a,a=c,c=temp;
    if(b>c)temp=b,b=c,c=temp;

    int root=1<<(K-1);//根节点的值
    int root_a=1,t_a=1;//a和b的公共祖先root_a
    int root_b=1,t_b=1;//b和c的公共祖先root_b
    int rest=1,result=1;//root_a和root_b的公共祖先result

    for(int i=a;i<=b;i++)
    {
        int t=root;
        while(i%t!=0)t=t>>1;
        if(t>t_a)t_a=t,root_a=i;
    }
    for(int i=b;i<=c;i++)
    {
        int t=root;
        while(i%t!=0)t=t>>1;
        if(t>t_b)t_b=t,root_b=i;
    }
    for(int i=root_a;i<=root_b;i++)
    {
        int t=root;
        while(i%t!=0)t=t>>1;
        if(t>rest)rest=t,result=i;
    }
    cout<<result;
    return 0;
} 
笔试的时候还专门写了一个树类,实现了一个树构造函数。。。笔试都快结束时才发现根本不用这么麻烦。
这个方法主要思想就是找a、b之间,b、c之间能整除最大的2的次幂的两个数root_a,root_b,
然后求出root_a,root_b 之间能整除最大的2的次幂的数result便是最终结果。
三个查找过程当然也可以写个函数,减少冗余代码。
全部评论
dfs改造,不断缩小范围,如果树的范围能涵盖就继续从左右子树搜索,这题很像leetcode里面校验这棵树是否是排序树的题目
点赞 回复 分享
发布于 2017-04-05 14:06
二分查找就够了
点赞 回复 分享
发布于 2017-04-05 11:08
根据树的性质来解,不用建树:
点赞 回复 分享
发布于 2017-04-05 10:36
能给个大致的思路不?我也是建了二叉排序树。。。。谢谢
点赞 回复 分享
发布于 2017-04-05 10:17

相关推荐

刘湘_passion:出国旅游?那就小心你的腰子咯
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务