由正整数1,2,3……组成了一颗二叉树。我们已知这个二叉树的最后一个结点是n。现在的问题是,结点m所在的子树中一共包括多少个结点。
这题如果采用递归,会超时
如果采用队列遍历每一层,会超内存
思路还是遍历每一层,计算出这一层的结点数,设置两个变量保存每一层的最大结点值和最小结点值
时间复杂度是O(logN)
#include<stdio.h>
int main()
{
int M,N;
while(scanf("%d%d",&M,&N)&&M&&N)
{
if(M>N)
{
printf("0\n");
continue;
}
else
{
int ret=1;
int curlevelmin=M,curlevelmax=M;
int nextlevelmin,nextlevelmax;
while(1)
{
nextlevelmin=2*curlevelmin;
nextlevelmax=2*curlevelmax+1;
if(nextlevelmax<=N)
{
ret+=(nextlevelmax-nextlevelmin+1);
if(nextlevelmax==N)
break;
}
else if(nextlevelmin<=N)
{
ret+=(N-nextlevelmin+1);
break;
}
else
break;
curlevelmin=nextlevelmin;
curlevelmax=nextlevelmax;
}
printf("%d\n",ret);
}
}
return 0;
}