• 二叉树(暑假每日一题 31)


         1
        / \
       2   3
      / \ / \
     4  5 6  7
    /\ /\ /\ /\
    ...     ... 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    如上图所示,由正整数 1 , 2 , 3 , … 1,2,3,… 1,2,3, 组成了一棵无限大的(满)二叉树

    从任意一个结点到根结点(编号是 1 1 1 的结点)都有一条唯一的路径,比如从 5 5 5 到根结点的路径是 ( 5 , 2 , 1 ) (5,2,1) (5,2,1),从 4 4 4 到根结点的路径是 ( 4 , 2 , 1 ) (4,2,1) (4,2,1),从根结点 1 1 1 到根结点的路径上只包含一个结点 1,因此路径就是 ( 1 ) (1) (1)

    对于两个结点 x 和 y,假设他们到根结点的路径分别是 ( x 1 , x 2 , … , 1 ) (x_1,x_2,…,1) (x1,x2,,1) ( y 1 , y 2 , … , 1 ) (y_1,y_2,…,1) (y1,y2,,1),那么必然存在两个正整数 i i i j j j,使得从 x i x_i xi y j y_j yj 开始,有 x i = y j , x i + 1 = y j + 1 , x i + 2 = y j + 2 , … x_i=y_j,x_{i+1}=y_{j+1},x_{i+2}=y_{j+2},… xi=yj,xi+1=yj+1,xi+2=yj+2,
    现在的问题就是,给定 x x x y y y,要求他们的公共父节点,即 x i x_i xi(也就是 y j y_j yj)。

    输入格式
    1 ≤ x , y ≤ 2 31 − 1 1≤x,y≤2^{31}−1 1x,y2311
    输入样例:

    10 4
    
    • 1

    输出样例:

    2
    
    • 1

    #include
    
    using namespace std;
    
    int main(){
        
        int x, y;
        cin >> x >> y;
        while(x != y){
            if(x > y) x >>= 1;
            else y >>= 1;
        }
        
        cout << x << endl;
        
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
  • 相关阅读:
    国庆第五天
    Android Studio 直接获取Spinner的值
    D. For Gamers. By Gamers.(思维 + dp + 二分)(调和级数)
    Three.js相机模拟
    【云原生 • Kubernetes】k8s功能特性、k8s集群架构介绍
    vivo 容器平台资源运营实践
    Debian常用命令
    蓝图通信、类的封装和继承——拾取物品01
    二进制安装k8s
    什么是电商云仓?
  • 原文地址:https://blog.csdn.net/qq_46456049/article/details/126446995