<数据结构>XDOJ314.完全二叉树的子树
2024-09-01 20:09:04
问题与解答
问题描述
对一棵完全二叉树,采用自上而下、自左往右的方式从1开始编号,我们已知这个二叉树的最后一个结点是n,现在的问题是结点m所在的子树一共包括多少个结点?
输入格式
输入数据包括多行,每行给出一组测试数据,包括两个整数m,n (1 <= m <= n <= 1000000000)。0 0表示输入结束。
输出格式
对于每一组测试数据,输出一行,该行包含一个整数,给出结点m所在子树中包括的结点的数目。
样例输入
3 12
0 0
样例输出
4
#include<stdio.h>
#include<queue> //队列
using namespace std;
int main()
{
int m,n,x,num;
queue<int> Q; //创建队列保存子树结点
while(scanf("%d%d", &m,&n)!=EOF && m && n) //多点测试
{
num = 0;
Q.push(m); //加入第一个结点
num++; //sum++
while(1)
{
/*取出当前结点*/
x = Q.front();
Q.pop();
/*添加当前结点的子树结点*/
if(2*x <= n) {Q.push(2*x); num++;} //每添加一个结点sum++
else break;
if(2*x+1 <= n) {Q.push(2*x+1); num++;}
else break;
}
while(!Q.empty()) Q.pop(); //不要忽略
printf("%d\n", num);
}
}
题后反思: 本质是BFS
- 这题的本质是遍历结点
- 遍历有两种实现方式:BFS\DFS
- BFS: 利用 队列 暂存元素
- DFS: 利用 栈 暂存元素
- 这题原解法的实质就是BFS, 而且不难知道,这题也可以用DFS(递归)求解,不过这往往涉及树的二叉链表实现,会比较繁琐
最新文章
- SpringMVC 400 Bad Request 问题
- Sql Server 行转列
- python 学习笔记7(装饰器)
- css003 选择器:明确设置哪些样式
- C# 在Visual Studio中一个项目有两个Main函数, 怎么设置哪个是入口?取代csc /main选项。
- 动态加载so文件
- Sae配置Java数据库连接
- 研究一下FBrush,它是从TWinControl才有的属性(可能是因为需要句柄)——发现{$R *.dfm}在运行期执行,而且很有深意,读到属性后赋值还会触发事件,这些无法在VCL代码里直接看到
- C++string函数之strcat_s
- SkiaSharp图像处理
- java代码之美(1)---Lambda
- ORACLE归档日志比联机重做日志小很多的情况总结
- H5 15-交集选择器
- axios 使用
- .Net页面缓存OutPutCache详解
- [转]C++11常用特性的使用经验总结
- Flash Actionscript AS3 渐变透明 mask遮罩
- Javascript之类型检测(一)
- c# richTextBox判断是否为图片文件
- Maven配置私服仓库