1 问题描述

题目描述

传说计算机学院有一位前辈叫做二叉哥,他十八般算法样样精通。他当年在程设的时候由于二叉树一举成名。大家为了纪念这一事件,尊称他为二叉哥!二叉树是一个什么样的东西呢?现在我们就来揭开二叉哥的二叉树的神秘面纱吧!

下图就是一棵有着9个节点的二叉树。顾名思义,二叉树就像一棵倒着生长的树,每个分叉点可以分出去两个枝条。我们把分叉点叫做"节点”,因为每个分叉点最多可以分出去两个枝条,所以就叫做"二叉”树。最顶层只有一个节点,我们把它叫做根节点。下图中,标号为1的节点就是根节点,它有两个孩子:节点2和节点3。节点2只有一个孩子,标号为4,而节点3有两个孩子,标号分别为5和6。下图中的二叉树第3层有3个节点,分别是7、8和9号节点。

二叉哥对于二叉树的掌握已经到了出神入化的程度,为了维护他的二叉树霸主地位,他准备了2^2^2^2^2个问题来迎接挑战者,现在我们来看下第0道吧。

一个有n个节点的二叉树的第m层至多有多少个节点?

输入

输入的第一行为一个数字T(1 <= T <= 10000),表示有T组数据。

接下来的T行每行有两个数字n和m(0 <= n, m <= 10^8),表示二叉树有n个节点,求m层最多有多少个节点。

根节点所在的为第0层。

输出

每个用例输出一个数字,表示最多的节点个数。

  测试输入 期待的输出 时间限制 内存限制 额外进程
测试用例 1 以文本方式显示

  1. 3↵
  2. 2 1↵
  3. 3 2↵
  4. 10 2↵
以文本方式显示

  1. 1↵
  2. 1↵
  3. 4↵
1秒 64M 0

2 解题

  • 这个题我其实想了很久,因为刚开始的时候我一直没有思路,觉得有太多的情况需要考虑,尤其是当第m层放不满的时候,如果要从右边拿过来的话就像是我们平时所说的牵一发而动全身,实在头疼
  • 最后终于发现了其中的规律
  • 首先从最简单的情况入手,先是每一层只放一个,然后来补嘛,

    然后开始往右填每一层,这个层已经不是横着的层了,但是其中还是有相同的规律

    当第4层无法填满的时候,把第四层当做一个新的开始,是不是自然而然想到递归了
    因为它回到了最开始的情况,情形处理都是一样的,不过这个时候传进去的参数m就不等于一开始的m了,应该是2

    递归结束的条件在程序里面都有写

  • 代码:
#include <math.h>
#include<stdio.h>
#include<iostream>
#include<cstdlib>
using namespace std;int num=0;void count(int n,int m){if(n<m+1){       //只放一个都不够num+=0;return;}else if(n==m+1){   //只放一个刚刚好num+=1;return ;}else{n=n-m-1;   //每层放一个之后剩下的num += 1; ///每层放一个那么m层就有1个了哦int layer=1; //第0层已经有了,直接开始第1层吧if(n==0||layer>m)     //没有节点了,或者层数已经够了,结束递归return;int need;need=pow(2,layer)-1;        //放满需要的节点数while(n-need>0){   //只要能放满还剩,重复一直放num+=pow(2,layer-1);layer++;          n-=need;need=pow(2,layer)-1;if(layer>m)        //注意判断是否达到了退出的条件return ;}if(n-need==0){   //刚好放满num+=pow(2,layer-1);return;}    else            //新的一层不够放,那么当做一个新的情况开始递归吧count(n,layer-1);}}
int main() {int n,m,t;//freopen("file in.txt","r",stdin);cin>>t;while(t--){cin>>n>>m;num=0;      //每一次都要初始化,不然会累加count(n,m);cout<<num<<endl;      }return 0;
}

3 小结

  • 二叉树一般都有很强的规律性,只要能寻找到其中的规律,那么就可以使用递归,因为没有规律的话递归是没有办法连贯下去的

16. 二叉哥的二叉树相关推荐

  1. 3006基于二叉链表的二叉树最长路径的求解(附思路)

    描述 设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写算法求出该二叉树中第一条最长的路径. 输入 多组数据.每组数据一行,为二叉树的先序序列(序列中元素为'0'时,表示该结点为 ...

  2. 3010基于二叉链表的二叉树高度的计算(附思路,WA的一种可能情况及代码)

    基于二叉链表的二叉树高度的计算 描述 设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写递归算法计算二叉树的高度. 输入 多组数据.每组数据一行,为二叉树的前序序列(序列中元素为 ...

  3. 3010基于二叉链表的二叉树高度的计算

    描述 设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写递归算法计算二叉树的高度. 输入 多组数据.每组数据一行,为二叉树的前序序列(序列中元素为'0'时,表示该结点为空).当输 ...

  4. 3003基于二叉链表的二叉树左右子树的交换

    描述 设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写递归算法交换该二叉树的左右孩子. 输入 多组数据.每组数据一行,为二叉树的先序序列(序列中元素为'0'时,表示该结点为空) ...

  5. 【数据结构】基于二叉链表的二叉树结点个数的统计

    基于二叉链表的二叉树结点个数的统计 描述 设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写三个递归算法分别对二叉树的结点(度为0.1.2)个数进行统计. 输入 多组数据.每组数 ...

  6. 基于二叉链表的二叉树高度的计算

    描述 设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写递归算法计算二叉树的高度. 输入 多组数据.每组数据一行,为二叉树的前序序列(序列中元素为'0'时,表示该结点为空).当输 ...

  7. pta 是否完全二叉搜索树_二叉树:构造一棵搜索树

    给「代码随想录」一个星标吧! ❝ 构造二叉搜索树,一不小心就平衡了 ❞ 108.将有序数组转换为二叉搜索树 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指 ...

  8. 3005-基于二叉链表的二叉树最大宽度的计算(附思路,注释,可能错误分析)

    描述 设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写算法计算该二叉树的最大宽度(二叉树的最大宽度是指二叉树所有层中结点个数的最大值). 输入 多组数据.每组数据一行,为二叉树 ...

  9. 3007基于二叉链表的二叉树叶子结点到根结点的路径的求解(附DFS在树里的应用分析,思路详解)

    以下代码用到的前置知识:DFS算法 可以看这个视频~只用看这个就能懂了~ DFS深搜解决迷宫问题(原理分析+代码实现)_哔哩哔哩_bilibilihttps://www.bilibili.com/vi ...

  10. 3004基于二叉链表的二叉树的双序遍历(附题意解释)

    描述 设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写递归算法实现该二叉树的双序遍历(双序遍历是指对于二叉树的每一个结点来说,先访问这个结点,再按双序遍历它的左子树,然后再一次 ...

最新文章

  1. 马斯克脑机接口、BrainOS相继发布,不努力也能有出路了
  2. 常见的集合容器应当避免的坑
  3. oauth2 单点登录_Spring Security Oauth2和Spring Boot实现单点登录
  4. mysql 生成数列_PHP生成器的创建和使用
  5. 台式计算机桌面待机时间怎么调,如何设置电脑屏幕待机时间
  6. 就业技术书文件表格_Word格式:工程预结算工作流程图及工作表单,附20余表格...
  7. stm32 窗口看门狗学习(二)
  8. 大量的QT控件及示例发放
  9. 中科大计算机专业少实习_为什么很少有计算机科学专业的人?
  10. 2021-06-20 pip有时候需要加上--user安装才好使
  11. latex hyperref_Latex 用subfig引用子图显示括号
  12. ERROR: Couldn't connect to Docker daemon at http+docker://localunixsocket - is it running?
  13. Python分词、情感分析工具SnowNLP使用方法
  14. 状态码 https dns解析过程
  15. android dropbox切换账户,输入用户名和密码到Dropbox用Calablash登录webview android
  16. mysql数据库order by_[数据库]mysql 使用order by
  17. 数据抓取可否发展出好的商业模式?
  18. 用python画环形图
  19. word在英文输入法的状态下,打出来的引号还是中文字符
  20. PDF怎么转长图?这些方法不妨了解一下

热门文章

  1. 诺顿杀毒软件22010最新注册码
  2. 讲师面试流程及试讲指导
  3. Nature:我叫“P值” 这是我的故事
  4. Windows XP SP3截至2011年4月更新补丁汇总(WinXP补丁包) 修正版
  5. 【精度】概率论之概念解析:边缘化(Marginalisation)
  6. 实验楼Linux入门:Linux用户管理
  7. 11 种主要神经网络结构图解
  8. 北京邮电大学计算机专业考研复试经验分享
  9. java去掉标点符号_java去除空格、标点符号的方法实例
  10. 英语基础语法学习笔记 2