[带余除法寻找公共节点]二叉树

二叉树

题目描述

如上图所示,由正整数1, 2, 3, ...组成了一棵无限大的二叉树。从某一个结点到根结点(编号是1的结点)都有一条唯一的路径,比如从10到根结点的路径是(10, 5, 2, 1),从4到根结点的路径是(4, 2, 1),从根结点1到根结点的路径上只包含一个结点1,因此路径就是(1)。对于两个结点x和y,假设他们到根结点的路径分别是(x1, x2, ... ,1)和(y1, y2, ... ,1)(这里显然有x = x1,y = y1),那么必然存在两个正整数i和j,使得从xi 和 yj开始,有xi = yj , xi + 1 = yj + 1, xi + 2 = yj + 2,... 现在的问题就是,给定x和y,要求xi(也就是yj)。

关于输入

输入只有一行,包括两个正整数x和y,这两个正整数都不大于1000。

关于输出

输出只有一个正整数xi。

例子输入
复制代码
10 4
例子输出
复制代码
2
解题分析

这个问题的关键在于理解题目中的二叉树的特性。在这个二叉树中,每个节点 i 的两个子节点是 2*i 和 2*i+1。因此,每个节点 i 的父节点是 i/2。这是一个关键的性质,因为它意味着我们可以通过除以2来找到任何节点的父节点。

给定两个节点 x 和 y,我们的目标是找到他们的最近公共祖先。由于我们可以通过除以2来找到任何节点的父节点,因此一个直观的方法是从 x 和 y 开始,不断地找他们的父节点,直到我们找到一个公共的节点。这个公共的节点就是他们的最近公共祖先。

在具体实现上,我们定义了一个函数`findCommonAncestor`,它接受两个整数 x 和 y 作为输入,返回这两个整数在二叉树中的最近公共祖先。在这个函数中,我们使用了一个循环,不断地将较大的数除以2,直到 x 和 y 相等。这是因为在这个二叉树中,一个节点的父节点总是它的一半,所以我们可以通过不断地将较大的数除以2来找到两个节点的最近公共祖先。

在`main`函数中,我们从用户那里获取输入的 x 和 y,调用`findCommonAncestor`函数找到他们的最近公共祖先,并打印出结果。

这个算法的时间复杂度是 O(log n),其中 n 是输入的节点的编号。这是因为在最坏的情况下,我们需要找到节点 1,这需要做 log n 次除法操作。因此,这个算法是非常高效的。

代码实现
cpp 复制代码
#include <stdio.h>

int findCommonAncestor(int x, int y) {
    while (x != y) {
        if (x > y) {
            x /= 2;
        } else {
            y /= 2;
        }
    }
    return x;
}

int main() {
    int x, y;
    scanf("%d %d", &x, &y);
    printf("%d\n", findCommonAncestor(x, y));
    return 0;
}
相关推荐
啊森要自信3 小时前
CANN ops-cv:AI 硬件端视觉算法推理训练的算子性能调优与实战应用详解
人工智能·算法·cann
仟濹3 小时前
算法打卡day2 (2026-02-07 周五) | 算法: DFS | 3_卡码网99_计数孤岛_DFS
算法·深度优先
驭渊的小故事3 小时前
简单模板笔记
数据结构·笔记·算法
YuTaoShao3 小时前
【LeetCode 每日一题】1653. 使字符串平衡的最少删除次数——(解法一)前后缀分解
算法·leetcode·职场和发展
VT.馒头3 小时前
【力扣】2727. 判断对象是否为空
javascript·数据结构·算法·leetcode·职场和发展
goodluckyaa4 小时前
LCR 006. 两数之和 II - 输入有序数组
算法
孤狼warrior4 小时前
YOLO目标检测 一千字解析yolo最初的摸样 模型下载,数据集构建及模型训练代码
人工智能·python·深度学习·算法·yolo·目标检测·目标跟踪
Σίσυφος19004 小时前
PCL法向量估计 之 RANSAC 平面估计法向量
算法·机器学习·平面
xhbaitxl4 小时前
算法学习day39-动态规划
学习·算法·动态规划
I_LPL4 小时前
day23 代码随想录算法训练营 回溯专题2
算法·hot100·回溯算法·求职面试