二叉树——新二叉树(洛谷 P1305)
题目选自洛谷P1305
这篇用来二叉树入门,讲述遍历二叉树的基本过程代码, 新二叉树只是洛谷的题目叫这个。
对于该题,我们用一个结构体node来表示树的每个结点,这个结构体数组tree来代表一棵树。
结构体内保存结点的值(字符值),左、右孩子的下标,这样我们可以直接通过下标来访问树了,进而输出节点的值。
为了知道根结点是从哪个开始的,我们在第一次输入三个字符之前记录一下第一个字符,对应的是哪一个位置就好。
对于树,我们采用映射的思想,因为只有26个字母,所以我们将a放在0下标的位置...也就是
t[s1-'a'].value=s1; //表示结点s1对于‘a’的绝对位置上,存的值就是s1;
(事实上也可以不保存值,因为0就是a了 依次排列下去,输出时直接+'a'输出字符也行)
然后我们把所有的左右孩子标记为-1,代表没有左右孩子,
对于s2和s3两个字符,如果!='*',就说明有孩子:
if(s2!='*') t[s1-'a'].left = (int)(s2-'a');
if(s3!='*') t[s1-'a'].right = (int)(s3-'a');
这样就是把s1结点的左右位置更改一下。
最重要的就是如何前、中、后序输出一棵树了。
下面给出3中遍历的代码,理解可能不是很容易,但是记住这个代码就非常地简单了!
例如前序遍历,无非就是先访问(输出),然后往左访问,再往右访问。
因为都是通过递归完成的,所以实在想不通过程也不必深究。
void pre_order(int x){ //前序遍历
printf("%c",t[x].value);
if(t[x].left!=-1) pre_order(t[x].left);
if(t[x].right!=-1) pre_order(t[x].right);
}
void in_order(int x){ //中序遍历
if(t[x].left!=-1) in_order(t[x].left);
printf("%c",t[x].value);
if(t[x].right!=-1) in_order(t[x].right);
}
void post_order(int x){ //后序遍历
if(t[x].left!=-1) post_order(t[x].left);
if(t[x].right!=-1) post_order(t[x].right);
printf("%c",t[x].value);
}例如该题目分别进行前中后序输出的结果就是这样的:
验证过,没毛病!
题目描述
输入一串二叉树,输出其前序遍历。
输入格式
第一行为二叉树的节点数 n。(1≤n≤26)
后面 n 行,每一个字母为节点,后两个字母分别为其左右儿子。
空节点用 *
表示
输出格式
二叉树的前序遍历。
输入输出样例
输入 1
6 abc bdi cj* d** i** j**
输出 1
abdicj
解题代码:
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<string.h>
using namespace std;
int n;
char s1,s2,s3;
struct node{char value;int left=-1,right=-1;
}t[30];
void pre_order(int x){printf("%c",t[x].value);if(t[x].left!=-1) pre_order(t[x].left);if(t[x].right!=-1) pre_order(t[x].right);
}
int main(){cin>>n;int index=-1;while(n--){cin>>s1>>s2>>s3;if(index==-1){index=(int)(s1-'a');}t[s1-'a'].value=s1;if(s2!='*') t[s1-'a'].left = (int)(s2-'a');if(s3!='*') t[s1-'a'].right = (int)(s3-'a');}pre_order(index);return 0;
}
二叉树——新二叉树(洛谷 P1305)相关推荐
- 二叉树——医院设置(洛谷 P1364)
题目选自洛谷P1364 从指定结点开始,使用DFS,对于某个结点来说,搜索的深度就是源点到这个结点的距离,单点贡献(该点所有居民到医院的距离之和)就是源点到这个结点的距离乘上该点的居民数量:然后加上自 ...
- 二叉树——美国血统(洛谷 P1827)
题目选自洛谷P1827 根据前序.中序遍历求出后序遍历,这也是二叉树很重要且基本的知识,还是有必要练练. 至于什么是前.中.后序遍历,这里就不再过多讲述. 用手模拟求解是简单的,接下来看看如何用代码来 ...
- 二叉树——二叉树的深度(洛谷 P4913)
题目选自洛谷P4913 题目描述 给出每个节点的两个儿子节点,建立一棵二叉树(根节点为 1),如果是叶子节点,则输入0 0.建好树后希望知道这棵二叉树的深度.二叉树的深度是指从根节点到叶子结点时,最多 ...
- 洛谷——P1305 新二叉树(新建二叉树以及遍历)
题目描述 输入一串二叉树,用遍历前序打出. 输入输出格式 输入格式: 第一行为二叉树的节点数n.(n \leq 26n≤26) 后面n行,每一个字母为节点,后两个字母分别为其左右儿子. 空节点用*表示 ...
- 用任意合法序列建立一棵二叉树(洛谷P1305题题解,Java语言描述)
前言 这题是极其麻烦极其麻烦的一道题(前提是你不知道它有套路)-- 我们不讲那些歪门邪道,我们正儿八经的解一下,想正经求解,很麻烦很麻烦... 题目要求 P1305题题解 分析 这题你看着容易,那是你 ...
- 通过“FBI树”复习二叉树算法(洛谷P1087题题解,Java语言描述)
题目要求 P1087题目链接 分析 所谓的"FBI树",其实就是一种二叉树,最后的结果也无非就是二叉树的后序遍历序列. 所以,考察的知识点就是--二叉树基本算法的灵活运用. 本题关 ...
- [JLOI2014]松鼠的新家 洛谷P3258
题目链接 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在"树&quo ...
- [洛谷P1040] 加分二叉树
洛谷题目链接:加分二叉树 题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,-,n),其中数字1,2,3,-,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di ...
- 信息学奥赛一本通 1981:【18NOIP普及组】对称二叉树 | 洛谷 P5018【NOIP2018 普及组】 对称二叉树
[题目链接] ybt 1981:[18NOIP普及组]对称二叉树 洛谷 P5018[NOIP2018 普及组] 对称二叉树 [题目考点] 二叉树 [解题思路] 先求出二叉树中各子树的结点数 遍历二叉树 ...
最新文章
- xpage 传参_Vuex入门、同步异步 存取值
- 使用pydub实现训练声音数据集加噪
- 手把手教你安装鸿蒙和运行第一个Demo(js)版
- linux 下启动jar小程序
- 【时间序列】时间序列建模的时间戳与时序特征衍生思路
- Elasticsearch中的document数据格式,简单的集群管理,商品的索引的CRUD操作(学习资料记录)
- 翻译 《Why Indy?》计划进度表
- 求链表是否有环和第一个交点
- java加载jdbc驱动,加载JDBC驱动
- 谷歌强烈推荐!浏览器助手,让你的浏览器至少提升10个档次!
- yum安装软件报错:Invalid configuration value: failovermethod=priority...
- Python: 计算百分比
- Hexo | yilia主题安装
- 计算机学院运动会解说词,学校运动会解说词30篇
- 基于android端计步器软件的尝试
- 一个屌丝程序猿的人生(一百一十七)
- 华为V8手机USB OTG Type-C接口数据线
- 链接chinanet无法出现登陆界面(电脑),360开wifi说缺少一个网卡
- C++面向对象实验(四)
- C6678多核DSP开发——image_processing例程
热门文章
- typedef用法(1)
- [转]apache MPM介绍
- 自己动手清除电脑中的***程序
- 我是一个*** (十四) 完
- python自动化上传图片_Python(二)借助七牛云通过脚本自动获取上传图片外链
- 软件开发安全性_开发具有有效安全性的软件的最佳方法
- raspberry pi3_我们将赠送Raspberry Pi 3 Ultimate Starter Kit
- ES6异步编程: co函数库的含义与用法
- HTML section元素
- 王者非法进入服务器维护封号,王者荣耀哪些行为会被封号 违规封号行为汇总...