Trees on the level UVA - 122 (二叉树的层次遍历)
题目链接:https://vjudge.net/problem/UVA-122
题目大意:输入一颗二叉树,你的任务是按从上到下,从左到右的顺序输出各个结点的值。每个结点都按照从根节点到它的移动序列给出(L表示左,R表示右) 在输入中,每个结点的左括号
和右括号之间没有空格,相邻结点之间用一个空格隔开。每棵树的输入用一对空括号)()结束 入上图所示:
注意:如果从根结点到某个叶节点的路径有的结点没有在输入中给出,或者给出超过一次,输出not complete。 结点个数不超过256
思路:显然是二叉树的层次遍历。
首先看一下输入部分:
bool read_input()//读入字符 {failed=false;//记录是否输入有误remove_tree(root);//释放内存空间root=newnode();//创建根节点for(;;){if(scanf("%s",s)!=1) return false;//整个输入结束if(!strcmp(s,"()")) break;//读到结束标志 退出循环int v;sscanf(&s[1],"%d",&v);//读入节点值addnode(v,strchr(s,',')+1);// }return true; }
这里要学一下sscanf的用法 strchr的用法
接下来看一下建树的代码:
void addnode(int v,char* s) {int len=strlen(s);Node* u=root;//从根节点往下走for(int i=0;i<len;i++)//找到当前位置 {if(s[i]=='L'){if(u->Left==NULL) u->Left=newnode();//节点不存在 建立新节点u=u->Left;}else if(s[i]=='R'){if(u->Right==NULL) u->Right=newnode();u=u->Right;}//忽略其他情况 即最后多余的那个空格 }if(u->have_value) failed=true;//已经赋过值 表明输入有误u->v=v;//没有误 给节点赋值 u->have_value=true;//标记已经赋值 }
建完树之后便是层次遍历的过程了,这里用bfs来写:
bool bfs(vector<int>& ans) {queue<Node*> q;ans.clear();q.push(root);//初始时只有一个根节点while(!q.empty()){Node* u=q.front();q.pop();if(!u->have_value) return false;//有节点没有被赋值过 表明输入有误ans.push_back(u->v);//增加到输出序列尾部if(u->Left!=NULL) q.push(u->Left);if(u->Right!=NULL) q.push(u->Right);}return true; }
这里有一块代码 是释放内存的 没有也不会错
void remove_tree(Node* u) {if(u==NULL) return ;remove_tree(u->Left);//递归释放左子树的空间remove_tree(u->Right);// delete u; }
下面看完整代码:
#include<iostream> #include<string.h> #include<stdio.h> #include<vector> #include<queue> using namespace std; const int maxn=256+5; char s[maxn];//保存读入的节点 bool failed; struct Node{bool have_value;//是否被赋值过int v;//结点值Node *Left,*Right;Node(){have_value=false;Left=NULL;Right=NULL;} }; Node *root; void remove_tree(Node* u) {if(u==NULL) return ;remove_tree(u->Left);//递归释放左子树的空间remove_tree(u->Right);// delete u; } Node* newnode() {return new Node(); } void addnode(int v,char* s) {int len=strlen(s);Node* u=root;//从根节点往下走for(int i=0;i<len;i++)//找到当前位置 {if(s[i]=='L'){if(u->Left==NULL) u->Left=newnode();//节点不存在 建立新节点u=u->Left;}else if(s[i]=='R'){if(u->Right==NULL) u->Right=newnode();u=u->Right;}//忽略其他情况 即最后多余的那个空格 }if(u->have_value) failed=true;//已经赋过值 表明输入有误u->v=v;//没有误 给节点赋值 u->have_value=true;//标记已经赋值 } bool read_input()//读入字符 {failed=false;//记录是否输入有误remove_tree(root);//释放内存空间root=newnode();//创建根节点for(;;){if(scanf("%s",s)!=1) return false;//整个输入结束if(!strcmp(s,"()")) break;//读到结束标志 退出循环int v;sscanf(&s[1],"%d",&v);//读入节点值addnode(v,strchr(s,',')+1);// }return true; } /*这样一来 输入和建树部分就已经结束了 接下来只需要按照层次顺序遍历这棵树此处使用一个队列来完成这个任务 初始时只有一个根节点 然后每次取出一个节点就把它的左右子结点放入队列中 */ bool bfs(vector<int>& ans) {queue<Node*> q;ans.clear();q.push(root);//初始时只有一个根节点while(!q.empty()){Node* u=q.front();q.pop();if(!u->have_value) return false;//有节点没有被赋值过 表明输入有误ans.push_back(u->v);//增加到输出序列尾部if(u->Left!=NULL) q.push(u->Left);if(u->Right!=NULL) q.push(u->Right);}return true; }int main() {while(read_input()){vector<int>ans;vector<int>::iterator it;if(failed||(!bfs(ans))) printf("not complete\n");else{it=ans.begin();printf("%d",*it);it++;for(it;it!=ans.end();it++)printf(" %d",*it);printf("\n");}}return 0; }
转载于:https://www.cnblogs.com/caijiaming/p/10350119.html
Trees on the level UVA - 122 (二叉树的层次遍历)相关推荐
- 【可运行,刘汝佳代码】Trees on the level UVA - 122
立志用最少的代码做最高效的表达 Trees are fundamental in many branches of computer science (Pun definitely intended) ...
- tree traversal (树的遍历) - 层序遍历 (level order traversal) - 二叉树的层序遍历
tree traversal (树的遍历) - 层序遍历 (level order traversal) - 二叉树的层序遍历 1. tree traversal (树的遍历) 1.1 深度优先搜索 ...
- 【每日一算法】二叉树的层次遍历 II
每日一算法-二叉树的层次遍历 II 题目 给定一个二叉树,返回其节点值自底向上的层次遍历. (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 例如: 给定二叉树 [3,9,20,null,n ...
- 数据结构——二叉树的层次遍历进阶
之前的一个博客 数据结构--二叉树的层次遍历看完这个,可以简单实现下面的问题 问题: 1.计算二叉树的最大宽度(二叉树的最大宽度是指二叉树所有层中结点个数的最大值. 2.用按层次顺序遍历二叉树的方法, ...
- 69. 二叉树的层次遍历Python实现
'''69. 二叉树的层次遍历 描述 给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问)您在真实的面试中是否遇到过这个题? 样例 给一棵二叉树 {3,9,20,#,#,15,7} :3/ \ ...
- 102. 二叉树的层次遍历
102. 二叉树的层次遍历 题意 给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 解题思路 递归:利用前序遍历的思想,在递归过程中记录下结点的深度,在对应深度将结点加 ...
- 关于二叉树的层次遍历的花样(c++实现)
花样变形1::二叉树层次遍历但是分层打印 分析:与普通打印多了一个分层打印,其实只要在在层次遍历中多设置一个标记变量即可 代码如下: //二叉树的层次遍历 void levelTravel(BTNod ...
- leetcode-102 二叉树的层次遍历
给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例如: 给定二叉树: [3,9,20,null,null,15,7] 3 / \ 9 20 / \ 15 7 返回其层 ...
- c++根据二叉树的层次遍历建立二叉树_LeetCode | 102.二叉树的层次遍历
这次来写一下 LeetCode 的第 102 题,二叉树的层次遍历. 题目描述 题目直接从 LeetCode 上截图过来,题目如下: 102.二叉树的层次遍历题目 上面的题就是 二叉树的层次遍历 题目 ...
最新文章
- 2022-2028年中国TCO导电玻璃行业市场研究分析及前瞻规划报告
- OpenNebula 入门安装配置
- Mac安装python3的opencv包
- c语言元素插入数组并排序,一数组按顺序序存放,插入一个数,按原来排序规律放在相应位置...
- Palo Alto Networks漏洞防护扩展至云端
- python写一个路径选择app_django下创建多个app并设置urls方法
- o型圈沟槽设计软件_265 电机壳体上轴承室和轴承外圈增加的O型圈工艺对轴承外圈(防蠕动)作用有多大?...
- 利用国内镜像加快pip下载速度和成功率
- Java 中equals 与 == 的区别:
- 黑苹果(1)为什么是黑苹果PPT?
- 解决GetTickCount的问题
- 01 GOF设计模式的定义和分类
- html增值税申报表,关于调整增值税纳税申报有关事项的公告
- 链家网页爬虫_爬虫-链家网租金数据
- 【Python爬虫】淘宝商品比价定向爬虫
- Sutton reinforcement learning _ Chapter 2 Multi-armed Bandits
- Linux内核“问题门” - 学习问题、经验集锦
- 获得手机上的软件名称 软件图标 软件包名
- matlab 有一函数 _写一程序_输入自变量的值_输出函数值.,第2讲 MATLAB入门1_数学建模_ppt_大学课件预览_高等教育资讯网...
- android打开app白色页面,完美解决Android App启动页有白屏闪过的问题