二叉树

 二叉树

时间限制: 1 Sec  内存限制: 32 MB

题目描述

 


    如上所示,由正整数1,2,3……组成了一颗特殊二叉树。我们已知这个二叉树的最后一个结点是n。现在的问题是,结点m所在的子树中一共包括多少个结点。

    比如,n = 12,m = 3那么上图中的结点13,14,15以及后面的结点都是不存在的,结点m所在子树中包括的结点有3,6,7,12,因此结点m的所在子树中共有4个结点。

输入

输入数据包括多行,每行给出一组测试数据,包括两个整数m,n (1 <= m <= n <= 1000000000)。最后一组测试数据中包括两个0,表示输入的结束,这组数据不用处理。

输出

 对于每一组测试数据,输出一行,该行包含一个整数,给出结点m所在子树中包括的结点的数目。

样例输入

3 7
142 657
42 754
0 0

样例输出

3
63
498

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
     int  m,n,d1,d2,x,i,left,right;
 
    while(scanf("%d%d",&m,&n)&&m&&n)
    {
        d1=log(m)/log(2)+1;  //找出 m 的层数  
        d2=log(n)/log(2)+1; // 找出 n 的层数 
        x=pow(2,d2-d1)-1;
 
        left=m; right=m;
 
        for(i=1;i<=(d2-d1);i++)
        {
            left *=2;  //最左边界
            right =right*2+1;  //最右边界
        }
 
        if(left>n)  //在子树左边
            printf("%d\n",x);
        else if(right<=n)   //在树右边
            printf("%d\n",x+right-left+1);
        else   //在子树树上
            printf("%d\n",n-left+1+x);
 
    }
    return 0;
}
 

阅读更多
版权声明:随便转载,加上出处就更完美了 https://blog.csdn.net/wx2306/article/details/79971228
个人分类: 数据结构
上一篇比我们优秀的人比我们还努力,你有什么资格不去奋斗
下一篇XYNUOJ 进击的二叉查找树
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭