问题与解答

问题描述

对一棵完全二叉树,采用自上而下、自左往右的方式从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

  1. 这题的本质是遍历结点
  2. 遍历有两种实现方式:BFS\DFS
    • BFS: 利用 队列 暂存元素
    • DFS: 利用 栈 暂存元素
  3. 这题原解法的实质就是BFS, 而且不难知道,这题也可以用DFS(递归)求解,不过这往往涉及树的二叉链表实现,会比较繁琐

最新文章

  1. SpringMVC 400 Bad Request 问题
  2. Sql Server 行转列
  3. python 学习笔记7(装饰器)
  4. css003 选择器:明确设置哪些样式
  5. C# 在Visual Studio中一个项目有两个Main函数, 怎么设置哪个是入口?取代csc /main选项。
  6. 动态加载so文件
  7. Sae配置Java数据库连接
  8. 研究一下FBrush,它是从TWinControl才有的属性(可能是因为需要句柄)——发现{$R *.dfm}在运行期执行,而且很有深意,读到属性后赋值还会触发事件,这些无法在VCL代码里直接看到
  9. C++string函数之strcat_s
  10. SkiaSharp图像处理
  11. java代码之美(1)---Lambda
  12. ORACLE归档日志比联机重做日志小很多的情况总结
  13. H5 15-交集选择器
  14. axios 使用
  15. .Net页面缓存OutPutCache详解
  16. [转]C++11常用特性的使用经验总结
  17. Flash Actionscript AS3 渐变透明 mask遮罩
  18. Javascript之类型检测(一)
  19. c# richTextBox判断是否为图片文件
  20. Maven配置私服仓库

热门文章

  1. Spark(四)【RDD编程算子】
  2. 关于ai算法的一个点子
  3. 常见排序——Java实现
  4. ORACLE CACHE BUFFER CHAINS原理
  5. zabbix之被动模式之编译安装proxy
  6. Linux系统分区及挂载点
  7. MFC入门示例之水平滚动条和垂直滚动条(CScroll Bar)
  8. 用户信息系统_serviceImpl
  9. 【JS】枚举类型
  10. 【Python】matplotlib直方图纵轴显示百分比