二叉树的简单题

在计算机科学中,二叉树是一种树型数据结构,每个节点最多有两个孩子。考虑一个无限的完整二叉树(每个节点有两个子节点,除了叶节点)定义如下。对于标记为v的节点,其左侧的孩子将标记为2 * v,其右侧的孩子将标记为2 * v + 1。根标记为1。
 
你会得到n个表格i,j的查询。对于每个查询,您必须打印标记为i的节点和标记为j的节点之间的最短路径的长度。
 

输入

第一行包含n(1≤n≤10 ^ 5)查询的数量。每个查询由一行中的两个空格分隔的整数i和j(1≤i,j≤10^ 9)组成。
 

产量

对于每个查询,将所需的答案打印在一行中。
 

示例输入


1 2
2 3
4 3
1024 2048
3214567 9998877

示例输出

1
2
3
1
44



思路: 找到最近的祖先节点

#include <iostream>

#include<stdio.h>
#include<math.h>
using namespace std;
int main()
{
    int n;
    long long a,b,t,ge;
    scanf("%d",&n);
    while(n--)
    {
        ge=0;
        scanf("%lld%lld",&a,&b);
        if(b<a)
        {
            t=a;
            a=b;
            b=t;
        }
        for(;;)
        {
            if(a==b)
                break;
            if(b>a)
                b/=2;
            else
                a/=2;
            ge++;


        }
        printf("%lld\n",ge);
    }


    return 0;
}

猜你喜欢

转载自blog.csdn.net/najiuzheyangbaacm/article/details/80155592