首页 > 试题广场 >

二叉树

[编程题]二叉树
  • 热度指数:16733 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
      1
      / \
    2   3
    / \ / \
  4 5 6 7
  /\ /\ /\ /\
如上图所示,由正整数 1, 2, 3, ...组成了一棵无限大的二叉树。从某一个结点到根结点(编号是1的结点)都有一条唯一的路径,比如从5到根结点的路径是(5, 2, 1),从4到根结点的路径是(4, 2, 1),从根结点1到根结点的路径上只包含一个结点1,因此路径就是(1)。对于两个结点x和y,假设他们到根结点的路径分别是(x1, x2, ... ,1)和(y1, y2,...,1),那么必然存在两个正整数i和j,使得从xi 和yj 开始,有xi = yj,xi + 1 = yj + 1,xi + 2 = yj + 2,...
现在的问题就是,给定x和y,要求他们的公共父节点,即xi(也就是 yj)。

输入描述:
输入包含多组数据,每组数据包含两个正整数x和y(1≤x, y≤2^31-1)。


输出描述:
对应每一组数据,输出一个正整数xi,即它们的首个公共父节点。
示例1

输入

10 4

输出

2
头像 健康快乐最重要
发表于 2020-03-03 17:49:27
唬人题 #include<iostream>using namespace std; int main(){ int a,b; while(cin>>a>>b){ while(a!=b){ a>b?a/ 展开全文
头像 牛客524979141号
发表于 2023-03-23 18:22:39
#include <iostream> using namespace std; // 只要一直找到相同的父节点就行了 int main() { int a, b; while(cin >> a >> b) { while(a != 展开全文
头像 Javker丶鑫
发表于 2021-03-21 17:09:21
#include<stdio.h> int main() { int x,y; while(scanf("%d %d",&x,&y)!=EOF) { while(x!=y){ x>y?(x/=2):(y/ 展开全文
头像 子非鱼_zy
发表于 2022-03-09 15:25:01
考察二叉树的性质。节点i,左孩子为2i,右孩子为2i+1; 同理,左节点2i和右节点2i+1的父节点为i,只要除2即可。 不停的将x,y中较大的那个除2,当二者相等时就找到了公共父节点。 #include<iostream> #include<algorithm> using 展开全文
头像 牛客440904392号
发表于 2024-10-01 22:09:39
import java.util.HashSet; import java.util.Scanner; import java.util.Set; public class Main { public static void main(String[] args) { Sca 展开全文
头像 烤肉__
发表于 2023-03-26 16:02:07
这题目就是个裸的LCA(最近公共祖先)问题。 向上标记法,就是让两个结点分别检查自己的父节点是否是两者的公共祖先,如果不是,那么大家一起往上跳一层。不断重复这个过程,直到最终收敛到同一个点。(必然收敛,因为最差大家都跳到根节点) 因为这题数据比较弱,是一个完全二叉树,且数值是int范围的,说明最大深 展开全文
头像 普罗列塔丽亚
发表于 2022-02-05 17:45:47
对两个节点分别求其到达根的路径序列,然后再求公共后缀即可 #include<iostream> #include<vector> using namespace std; vector<int> getPath(int& 展开全文
头像 勋谦
发表于 2024-06-27 10:45:12
#include <iostream> using namespace std; int main(){ int x,y; while(cin >> x >> y){ while(x != y){ if(x > y)x = x /2; 展开全文
头像 philos
发表于 2021-02-06 21:42:42
思路 如果是普通的二叉树,求公共父节点的话,就是遍历某个根节点的左右子树,看看这两个节点是否在一棵子树上,在的话就继续遍历子树,不在的话就直接返回根节点。 而这道题,很容易看出来一个节点 i 的父节点就是 i/2,那就很简单了,不断除以 2 直到相等就好了。 #include<iostream 展开全文
头像 尤姆
发表于 2023-03-01 08:20:56
#include<cstdio> #include<vector> using namespace std; int main(){ long long x, y; while (scanf("%lld %lld", &x, &y) != EOF){ vector&l 展开全文