原题链接:http://ac.jobdu.com/problem.php?pid=1113

题目描述:

如上所示,由正整数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 12
0 0
样例输出:
    4
题解:
  递归版本:
  这道题第一想法是递归,左子树和右子树的结点数和再加1。
代码如下:
 #include <stdio.h>

 int nodeNum_rec(int m,int n)
{
if(m>n)
return ;
return nodeNum_rec(*m,n)+nodeNum_rec(*m+,n)+;
}
int main()
{
int n,m;
int num; freopen("tree.in","r",stdin);
freopen("tree.out","w",stdout); while(scanf("%d %d",&m,&n)!=EOF&&m&&n)
{ num=nodeNum_rec(m,n); printf("%d\n",num);
} return ;
}

  当题目中n的数目到达十亿级别是,显然这么做会超时的。

  非递归版本:

  这道题的另一种解法是采用非递归,即利用完全二叉树的性质,倒数第二层网上必定是满二叉树,先计算满二叉子树的结点数,然后再根据情况加上剩下的部分。代码如下:

 #include <stdio.h>
#include <math.h>
int nodeNum(int m,int n)
{
int deep_n,deep_m;
int sum;
int k;
int start,end; deep_n=log(n)/log()+;//n的高度
deep_m=log(m)/log()+;//m的高度
sum=;
k=;
//计算到倒数第二层,这几层肯定都是满的,且是按照1、2、4的规律
for(int i=;i<deep_n-deep_m;i++){
sum=sum+k;
k=*k;
} //计算m的子树在最后一层的起始点和最后节点
start=m*k;
end=start+k;
if(end<=n)//最后一层也是满的
sum=sum+k;
else//最后一层不是满的,还差多少补上
{ for(int i=start; i<=n; i++)
{
sum++;
} }
return sum;
} int main()
{
int n,m;
int num; freopen("tree.in","r",stdin);
freopen("tree.out","w",stdout); while(scanf("%d %d",&m,&n)!=EOF&&m&&n)
{ num=nodeNum_rec(m,n); printf("%d\n",num);
} return ;
}

[九度OJ]1113.二叉树(求完全二叉树任意结点所在子树的结点数)的更多相关文章

  1. 九度OJ 1113 二叉树

    题目地址:http://ac.jobdu.com/problem.php?pid=1113 题目描述: 如上所示,由正整数1,2,3……组成了一颗特殊二叉树.我们已知这个二叉树的最后一个结点是n.现在 ...

  2. 九度OJ 1113:二叉树 (完全二叉树)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5079 解决:1499 题目描述: 如上所示,由正整数1,2,3--组成了一颗特殊二叉树.我们已知这个二叉树的最后一个结点是n.现在的问题是 ...

  3. 九度OJ 1541 二叉树【数据结构】

    题目地址:http://ac.jobdu.com/problem.php?pid=1541 题目描述: 旋转是二叉树的基本操作,我们可以对任意一个存在父亲节点的子节点进行旋转,包括如下几种形式(设被旋 ...

  4. [九度OJ]1078.二叉树的遍历(重建)

    原题链接:http://ac.jobdu.com/problem.php?pid=1078 题目描述: 二叉树的前序.中序.后序遍历的定义:前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其 ...

  5. 九度OJ 1078 二叉树遍历

    题目地址:http://ac.jobdu.com/problem.php?pid=1078 题目描述: 二叉树的前序.中序.后序遍历的定义: 前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历 ...

  6. 九度oj 1184 二叉树遍历

    原题链接:http://ac.jobdu.com/problem.php?pid=1184 简单的二叉树重建,遍历. 如下: #include<cstdio> #include<cs ...

  7. 九度OJ 1046:求最大值 (基础题)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:9861 解决:4013 题目描述: 输入10个数,要求输出其中的最大值. 输入: 测试数据有多组,每组10个数. 输出: 对于每组输入,请输 ...

  8. 九度OJ 1128:求平均年龄 (基础题)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2080 解决:1084 题目描述: 班上有学生若干名,给出每名学生的年龄(整数),求班上所有学生的平均年龄,保留到小数点后两位. 输入: 第 ...

  9. 九度oj 1521 二叉树的镜像

    原题链接:http://ac.jobdu.com/problem.php?pid=1521 水题,如下.. #include<algorithm> #include<iostream ...

随机推荐

  1. 1044: [HAOI2008]木棍分割 - BZOJ

    Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长 ...

  2. 团体程序设计天梯赛-练习集L1-005. 考试座位号

    L1-005. 考试座位号 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 每个PAT考生在参加考试时都会被分配两个座位号,一个 ...

  3. javascript div z-index, input tabindex属性说明

    <html> <body> <form> 用户名: <input type="text" tabindex="1" / ...

  4. web机制简笔

    1 Web 1.1输入url地址 1.1.1服务器进行url解析,调用相关服务处理,返回处理结果—字符串 1.2得到返回字符串(显示描述+操作触发描述) 1.3Internet explore进行相关 ...

  5. 如何在CHROME里调试前端代码?

    以前看前端们调得很神的, 刚看书到这里,作一个记录,演练了一下,确实有点神!!! :) <!DOCTYPE html> <html lang="en"> & ...

  6. BZOJ 3925 ZJOI2015 地震后的幻想乡

    假设我们用了边权前i小的边使得图连通,那么对答案的贡献为i/m+1 又因为期望的线性性质,我们只需要求用了i条边就可以了 不妨设g(S)(i)表示用了i条边使得点集S连通的概率 设f(S)(i)表示用 ...

  7. nginx配置静态文件服务器

    搭建文件服务器 要点就是root目录,会自动指向索引文件 如: index, index.html等 server { client_max_body_size 4G; listen 80; ## l ...

  8. SPRING IN ACTION 第4版笔记-第八章Advanced Spring MVC-007-给flowl加权限控制<secured>

    States, transitions, and entire flows can be secured in Spring Web Flow by using the <secured> ...

  9. Android隐藏输入法键盘(hideSoftInputFromInputMethod没有效果)

    在个别时候,需要强制隐藏Android输入法键盘,如当前键盘正在显示,这个时候点击了侧滑面板,就要强制隐藏输入法键盘.网上常见的方法有: 1. InputMethodManager imm = (In ...

  10. Git教程(3)命令行使用git简单示例

    基础 Git系统下的的文件有3种状态: 已修改(modified):已修改表示修改了文件,但还没保存到数据库中. 已暂存(staged) : 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下 ...