• 九度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
    ****************************************************************/


    编程算法爱好者。
  • 相关阅读:
    jQuery 基本选择器
    JavaScriptif while for switch流程控制 JS函数 内置对象
    JavaScrip基本语法
    数据库 存储引擎 表的操作 数值类型 时间类型 字符串类型 枚举集合 约束
    数据库基础知识 管理员 用户登录授权的操作
    粘包的产生原理 以及如何解决粘包问题
    socket TCP DPT 网络编程
    2018年年终总结
    Android技术分享
    No accelerator found
  • 原文地址:https://www.cnblogs.com/liangrx06/p/5083919.html
Copyright © 2020-2023  润新知