数据结构练习:完全二叉树的子树
题目描述:
对一棵完全二叉树,采用自上而下、自左往右的方式从1开始编号,我们已知这个二叉树的最后一个结点是n,现在的问题是结点m所在的子树一共包括多少个结点?
输入格式
输入数据包括多行,每行给出一组测试数据,包括两个整数m,n (1 <= m <= n <= 1000000000)。0 0表示输入结束。
输出格式
对于每一组测试数据,输出一行,该行包含一个整数,给出结点m所在子树中包括的结点的数目。
样例输入
3 12
0 0
样例输出
4
和网上大部分思路都差不多,利用完全二叉树左右子树和根节点之间的关系,我用了队列让过程更清晰
#include<stdio.h>
#include<iostream>
#include<queue>
using namespace std;
int num,num1,num2;
int cont=0;
queue<int>data;
int main(){
int m,n;
while (cin>>m>>n)
{
cont=0;
if (m==0&&n==0)//如果读入0 0就结束
{
break;
}
data.push(m);cont++;
while (!data.empty())
{
num=data.front();
num1=2*num;
num2=2*num+1;
data.pop();
if (num1<=n)//如果数据合法就入队列
{
data.push(num1);
cont++;
}
if (num2<=n)
{
data.push(num2);
cont++;
}
}
printf("%d\n",cont);
}
}