#C++初学记录(树和二叉树)
二叉树的编号
例题 6-6 小球下落问题
有一棵二叉树,最大深度为D,且所有叶子深度都相同。所有节点从上到下,从左到右编号为1,2,3,4,....,2^D-1。在节点1处放置小球,他会往下落。每个节点上都有一个开关,初始全部关闭,每当有小球落到一个开关上时,状态都会改变,当一个小球到达节点时,如果该节点上的开关关闭则往左走,否则往右走,直到走到叶子节点,一些小球从节点1处开始依次下落。最后一个小球回到哪里呢?输入叶子深度D,小球个数I,输入第I个小球最后所在的叶子编号。假设I不超过整棵树的叶子个数,D<=20。输入最多包含1000组数据。
**get **
4 2
3 4
10 1
2 2
8 128
16 12345
put
12
7
512
3
255
36358
#include<iostream>
#include<cstring>
const int maxd=20;
int s[1<<maxd];
int main()
{
int D,I;
while((cin>>D>>I)==2)
{
memset(s,0,sizeof(s));
int k=1,n=(1<<D)-1;
for(int i=0;i<I;i++)
{
k=1;
for(;;;)
{
s[k]=!s[k];
k=s[k]?2*k:2*k+1;
if(k>n)break;
}
}
cout<<k/2<<endl;
}
return 0;
}
代码非常基础不难理解,用k表示小球现在所在的节点位置再进行判断是否出界出界则跳出循环后进行下一步循环并且对k进行初始化,直到循环结束即第I个小球下落到底。
但是,这样做的代码有一个明显的缺陷,那就是时间复杂度问题,运算量太大,由于I可以高达2D-1,每组测试数据下落总层数可能会高达(219)*19=9961472,并且一共可能有10000组数据。
还有一种方法我们可以这样理解,每个小球都会落到根节点上,并且前两个小球一定必然是一个落在左边子树上一个落在右边子树上,一般的,只需要看小球编号的奇偶性,就能直到他最终会在那棵子树中,对于那些落入根节点左子树的小球来说,只需要知道该小球是第几个落在根的左子树,就可以直到他下一步往左还是往右了,依次类推,直到小球落到叶子上为止。
如果使用题目中给的编号I,则当I是奇数时,他是往左走的第(I+1)/2个小球,当I是偶数时,他是往右走的第I/2个小球。这样,可以直接模拟最后一个小球的路线,实现代码:
while((cin>>D>>I)==2)
{
int k=1;
for(int i=0;i<D-1;i++)
if(I%2){
k=k*2;
I=(I+1)/2;
}
else
{
k=k*2+1;
I/=2;
}
cout<<k<<endl;
}
#C++初学记录(树和二叉树)的更多相关文章
- Java数据结构之树和二叉树
从这里开始将要进行Java数据结构的相关讲解,Are you ready?Let's go~~ Java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来的 ...
- 数据结构与算法系列研究五——树、二叉树、三叉树、平衡排序二叉树AVL
树.二叉树.三叉树.平衡排序二叉树AVL 一.树的定义 树是计算机算法最重要的非线性结构.树中每个数据元素至多有一个直接前驱,但可以有多个直接后继.树是一种以分支关系定义的层次结构. a.树是n ...
- 数据结构与算法(C/C++版)【树与二叉树】
第六章<树与二叉树> 树结构是一种非线性存储结构,存储的是具有"一对多"关系的数据元素的集合. 结点: A.B.C等,结点不仅包含数据元素,而且包含指向子树的分支.例如 ...
- K:树、二叉树与森林之间的转换及其相关代码实现
相关介绍: 二叉树是树的一种特殊形态,在二叉树中一个节点至多有左.右两个子节点,而在树中一个节点可以包含任意数目的子节点,对于森林,其是多棵树所组成的一个整体,树与树之间彼此相互独立,互不干扰,但其 ...
- 【C#数据结构系列】树和二叉树
线性结构中的数据元素是一对一的关系,树形结构是一对多的非线性结构,非常类似于自然界中的树,数据元素之间既有分支关系,又有层次关系.树形结构在现实世界中广泛存在,如家族的家谱.一个单位的行政机构组织等都 ...
- 【algo&ds】【吐血整理】4.树和二叉树、完全二叉树、满二叉树、二叉查找树、平衡二叉树、堆、哈夫曼树、B树、字典树、红黑树、跳表、散列表
本博客内容耗时4天整理,如果需要转载,请注明出处,谢谢. 1.树 1.1树的定义 在计算机科学中,树(英语:tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结 ...
- 树(二叉树 & 二叉搜索树 & 哈夫曼树 & 字典树)
树:n(n>=0)个节点的有限集.有且只有一个root,子树的个数没有限制但互不相交.结点拥有的子树个数就是该结点的度(Degree).度为0的是叶结点,除根结点和叶结点,其他的是内部结点.结点 ...
- Java数据结构之树和二叉树(2)
从这里始将要继续进行Java数据结构的相关讲解,Are you ready?Let's go~~ Java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来 ...
- lintcode :前序遍历和中序遍历树构造二叉树
解题 前序遍历和中序遍历树构造二叉树 根据前序遍历和中序遍历树构造二叉树. 样例 给出中序遍历:[1,2,3]和前序遍历:[2,1,3]. 返回如下的树: 2 / \ 1 3 注意 你可以假设树中不存 ...
- lintcode: 中序遍历和后序遍历树构造二叉树
题目 中序遍历和后序遍历树构造二叉树 根据中序遍历和后序遍历树构造二叉树 样例 给出树的中序遍历: [1,2,3] 和后序遍历: [1,3,2] 返回如下的树: 2 / \ 1 3 注意 你可 ...
随机推荐
- 【转载】 C#使用Newtonsoft.Json组件来反序列化字符串为对象
在Asp.Net网站开发的过程中,很多时候会遇到对象的序列化和反序列化操作,Newtonsoft.Json组件是专门用来序列化和反序列化操作的一个功能组件,引入这个DLL组件后,就可使用JsonCon ...
- python day 14: 作业:开发一个能够多用户上传文件的FTP脚本
目录 python day 14 1. 要求 2. 自己写的程序目录 3. models模块 4. settings模块 5. tcp_server模块 6. client模块 7. 后记 pytho ...
- css3 text-fill-color属性
text-fill-color是什么意思呢?单单从字面上来看就是“文本填充颜色”,不过它实际也是设置对象中文字的填充颜色,和color的效果很相似.如果同时设置text-fill-color和colo ...
- Windows10 上安装 Anaconda 后命令提示符(cmd)下无法执行(python / pip)命令解决方案
原文:https://blog.csdn.net/qq_38644840/article/details/85064408 安装Anaconda后一段时间内能够在命令提示符(cmd)界面运行pytho ...
- cookie删除失效问题
在一个yii2的项目中使用了cookie,设置.获取都没有问题,但是在删除时候失败了. 要想删除cookie成功,只是设置cookie值为null,或设置时间为过期时间是不行的,还需要设置path,一 ...
- golang静态编译
golang 的编译(不涉及 cgo 编译的前提下)默认使用了静态编译,不依赖任何动态链接库. 这样可以任意部署到各种运行环境,不用担心依赖库的版本问题.只是体积大一点而已,存储时占用了一点磁盘,运行 ...
- Justice(HDU6557+2018年吉林站+二进制)
题目链接 传送门 题意 给你\(n\)个数,每个数表示\(\frac{1}{2^{a_i}}\),要你把这\(n\)个数分为两堆,使得每堆的和都大于等于\(\frac{1}{2}\). 思路 首先我们 ...
- Centos7-Gnome安装
查看grouplist yum grouplist 安装gnome yum groupinstall "GNOME Desktop" root用户权限下,设置centos系统默认的 ...
- 《BUG创造队》第六次作业:团队项目系统设计改进与详细设计
项目 内容 这个作业属于哪个课程 2016级软件工程 这个作业的要求在哪里 实验十 团队作业6:团队项目系统设计改进与详细设计 团队名称 BUG创造队 作业学习目标 1.编写完整<软件系统设计说 ...
- Echo团队Alpha冲刺随笔 - 第八天
项目冲刺情况 进展 程序基本完成,根据实际,添加完善新接口 问题 根据功能对接出现的问题继续进行改进 心得 放假了放松下 今日会议内容 黄少勇 今日进展 测试小程序,添加异常和错误操作的处理 存在问题 ...