zoukankan      html  css  js  c++  java
  • 九度OJ 1113:二叉树 (完全二叉树)

    时间限制:1 秒

    内存限制:32 兆

    特殊判题:

    提交:5079

    解决:1499

    题目描述:

     


        如上所示,由正整数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 120 0
    样例输出:
    4
    来源:
    2007年北京大学计算机研究生机试真题

    思路:

    完全二叉树与二进制有分不开的性质。此题用递归可解,递归过程与n的二进制分解有关,具体见代码。


    代码:

    #include <stdio.h>
    #include <string.h>
     
    int dep(int n)
    {
        int depth = 0;
        while (n)
        {
            n /= 2;
            depth ++;
        }
        return depth;
    }
     
    int main(void)
    {
        int n, m, i;
        int ndepth, mdepth;
        int mcount;
     
        while (scanf("%d%d", &m, &n) != EOF)
        {
            if (m == 0 && n == 0)
                break;
     
            ndepth = dep(n);
            mdepth = dep(m);
     
            mcount = 1;
            int left=m, right=m+1;
            for (i=0; i<ndepth-mdepth; i++)
            {
                left <<= 1;
                right <<= 1;
                mcount <<= 1;
            }
            if (n >= left && n<right)
                mcount += n-left+1;
            else if (n >= right)
                mcount += right-1-left+1;
            mcount --;
     
            printf("%d
    ", mcount);
        }
     
        return 0;
    }
    /**************************************************************
        Problem: 1113
        User: liangrx06
        Language: C
        Result: Accepted
        Time:0 ms
        Memory:912 kb
    ****************************************************************/


    编程算法爱好者。
  • 相关阅读:
    C语言源代码——计算任何一天是星期几
    计算任意一天是星期几
    wpf利用线程制作初始界面和关闭窗体特效
    实用的 集合工具类 和 String工具类
    从“关于Java堆与栈的思考”一帖看错误信息的传播
    web.xml 配置中classpath: 与classpath*:的区别
    git的安装-环境变量配置
    解决Oracle安装时报错“SID已在使用”办法
    ORACLE日期时间函数
    Java 开发环境配置
  • 原文地址:https://www.cnblogs.com/liangrx06/p/5083919.html
Copyright © 2011-2022 走看看