16. 二叉哥的二叉树
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秒 | 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. 二叉哥的二叉树相关推荐
- 3006基于二叉链表的二叉树最长路径的求解(附思路)
描述 设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写算法求出该二叉树中第一条最长的路径. 输入 多组数据.每组数据一行,为二叉树的先序序列(序列中元素为'0'时,表示该结点为 ...
- 3010基于二叉链表的二叉树高度的计算(附思路,WA的一种可能情况及代码)
基于二叉链表的二叉树高度的计算 描述 设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写递归算法计算二叉树的高度. 输入 多组数据.每组数据一行,为二叉树的前序序列(序列中元素为 ...
- 3010基于二叉链表的二叉树高度的计算
描述 设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写递归算法计算二叉树的高度. 输入 多组数据.每组数据一行,为二叉树的前序序列(序列中元素为'0'时,表示该结点为空).当输 ...
- 3003基于二叉链表的二叉树左右子树的交换
描述 设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写递归算法交换该二叉树的左右孩子. 输入 多组数据.每组数据一行,为二叉树的先序序列(序列中元素为'0'时,表示该结点为空) ...
- 【数据结构】基于二叉链表的二叉树结点个数的统计
基于二叉链表的二叉树结点个数的统计 描述 设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写三个递归算法分别对二叉树的结点(度为0.1.2)个数进行统计. 输入 多组数据.每组数 ...
- 基于二叉链表的二叉树高度的计算
描述 设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写递归算法计算二叉树的高度. 输入 多组数据.每组数据一行,为二叉树的前序序列(序列中元素为'0'时,表示该结点为空).当输 ...
- pta 是否完全二叉搜索树_二叉树:构造一棵搜索树
给「代码随想录」一个星标吧! ❝ 构造二叉搜索树,一不小心就平衡了 ❞ 108.将有序数组转换为二叉搜索树 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指 ...
- 3005-基于二叉链表的二叉树最大宽度的计算(附思路,注释,可能错误分析)
描述 设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写算法计算该二叉树的最大宽度(二叉树的最大宽度是指二叉树所有层中结点个数的最大值). 输入 多组数据.每组数据一行,为二叉树 ...
- 3007基于二叉链表的二叉树叶子结点到根结点的路径的求解(附DFS在树里的应用分析,思路详解)
以下代码用到的前置知识:DFS算法 可以看这个视频~只用看这个就能懂了~ DFS深搜解决迷宫问题(原理分析+代码实现)_哔哩哔哩_bilibilihttps://www.bilibili.com/vi ...
- 3004基于二叉链表的二叉树的双序遍历(附题意解释)
描述 设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写递归算法实现该二叉树的双序遍历(双序遍历是指对于二叉树的每一个结点来说,先访问这个结点,再按双序遍历它的左子树,然后再一次 ...
最新文章
- 马斯克脑机接口、BrainOS相继发布,不努力也能有出路了
- 常见的集合容器应当避免的坑
- oauth2 单点登录_Spring Security Oauth2和Spring Boot实现单点登录
- mysql 生成数列_PHP生成器的创建和使用
- 台式计算机桌面待机时间怎么调,如何设置电脑屏幕待机时间
- 就业技术书文件表格_Word格式:工程预结算工作流程图及工作表单,附20余表格...
- stm32 窗口看门狗学习(二)
- 大量的QT控件及示例发放
- 中科大计算机专业少实习_为什么很少有计算机科学专业的人?
- 2021-06-20 pip有时候需要加上--user安装才好使
- latex hyperref_Latex 用subfig引用子图显示括号
- ERROR: Couldn't connect to Docker daemon at http+docker://localunixsocket - is it running?
- Python分词、情感分析工具SnowNLP使用方法
- 状态码 https dns解析过程
- android dropbox切换账户,输入用户名和密码到Dropbox用Calablash登录webview android
- mysql数据库order by_[数据库]mysql 使用order by
- 数据抓取可否发展出好的商业模式?
- 用python画环形图
- word在英文输入法的状态下,打出来的引号还是中文字符
- PDF怎么转长图?这些方法不妨了解一下