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

news/2025/2/5 18:38:17/

二叉树

题目描述


如上图所示,由正整数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 次除法操作。因此,这个算法是非常高效的。

代码实现
#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;
}


http://www.ppmy.cn/news/1241947.html

相关文章

2023年亚太杯数学建模C题新能源汽车成品文章(思路模型代码成品)

一、翻译 新能源汽车是指采用先进的技术原理、新技术和新结构&#xff0c;以非常规车用燃料&#xff08;非常规车用燃料是指汽油和柴油以外的燃料(非常规车用燃料是指汽油和柴油以外的燃料&#xff09;&#xff0c;并集成了汽车动力控制和驱动等先进技术的汽车。新能源汽车包括…

vue3中如何使用TypeScript?

在Vue 3中引入和使用TypeScript非常简单。下面是在Vue 3中引入和使用TypeScript的步骤&#xff1a; 创建Vue 3项目&#xff1a;首先&#xff0c;使用Vue CLI创建一个新的Vue 3项目。可以使用以下命令&#xff1a; vue create my-project在创建项目时&#xff0c;选择TypeScri…

Python武器库开发-前端篇之CSS盒模型(三十一)

前端篇之CSS盒模型(三十一) CSS盒模型是指网页中的每个元素可以看做是一个矩形盒子&#xff0c;该盒子有四个主要部分组成&#xff1a;content、padding、border和margin。其中&#xff1a; content&#xff1a;指盒子中的内容区域&#xff0c;可以包含文本、图像、视频、其他…

JSP EL表达式之 empty

好 本文我们还是继续说EL表达式 我们来讲一个非空判断的好手 empty 我们直接编写代码如下 <% page contentType"text/html; charsetUTF-8" pageEncoding"UTF-8" %> <%request.setCharacterEncoding("UTF-8");%> <!DOCTYPE html&…

GDPU 数据结构 天码行空11

文章目录 数据结构实验十一 图的创建与存储一、实验目的二、实验内容三、【实验源代码】&#x1f37b; CPP版&#x1f37b; c 语言版&#x1f37b; java版 四、【实验结果】五、【实验总结】 数据结构实验十一 图的创建与存储 一、实验目的 1、 理解图的存储结构与基本操作&a…

MyBatis框架_01

Web后端开发_03 MyBatis框架 什么是MyBatis? MyBatis是一款优秀的持久层框架&#xff0c;用于简化JDBC的开发。MyBatis本是 Apache的一个开源项目iBatis&#xff0c;2010年这个项目由apache迁移到了google code&#xff0c;并且改名为MyBatis 。2013年11月迁移到Github。官网…

maven常用打包命令,值传递和引用传递,Java包 ,JDK 中常用的包有哪些,import java和javax有什么区别

文章目录 maven常用打包命令Java程序设计语言对对象采用的不是引用调用&#xff0c;实际上&#xff0c;对象引用是按值传递的。值传递和引用传递有什么区别Java包 &#xff0c;JDK 中常用的包有哪些import java和javax有什么区别 谈谈java基础的内容&#xff0c;而且很多人都回…

React + BraftEditor 实现富文本编辑

Braft Editor 是一个基于 React 和 Draft-js 开发的富文本编辑器&#xff0c;提供了丰富的基础功能&#xff0c;如基本文本格式化、列表、链接、图片上传、视频插入等&#xff0c;并且还支持扩展。 首先&#xff0c;确保你已经在项目中安装了 Braft Editor 和它的依赖项&#x…