二叉树的简单题

在计算机科学中,二叉树是一种树型数据结构,每个节点最多有两个孩子。考虑一个无限的完整二叉树(每个节点有两个子节点,除了叶节点)定义如下。对于标记为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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值