题目:

例:输入一棵二叉树,你的任务是按从上到下,从左到右的顺序输出每一个节点的值。每个节点都按照从根节点到它的移动序列给出(L表示左,R表示右)。在输入中,每个节点的左括号和右括号之间没有空格,相邻节点之间用一个空格隔开。每课树的输入用一对空括号“()”结束(这对括号本身不代表任何节点)。注意,如果从根到某个节点的路径上有的节点没有在输入的中给出,或者给出超过一次,输出not complete。节点个数不超过256个。

样例输入:
(11,LL) (7,LLL) (8,R) (5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) ()

(3,L) (4,R) ()

样例输出:
5 4 8 11 13 4 7 2 1

-1

分析与解答

1.整体来说需要:输入,建立结点,将其组织成一棵树,利用bfs,队列进行层次遍历,输出
2.二叉树结点定义,一个结点:树根的值,左子树(还是结点类型),右子树。(递归定义),每次需要新node,调用newnode
3.数据填到树上,从根开始,按照输入,往左往右走,如果目标不存在,调用newnode
4.按层次顺序遍历,每次取出一个结点,把他左右子节点放进队列,取出q.front放到输出序列vector里
5.遍历vector,输出即可
6.为了防止内存被浪费,需要在下一组数据前,释放本组数据生成的二叉树

// UVa122 Trees on the level
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;const int maxn = 256 + 10;struct Node{//二叉树的结点定义 bool have_value;//是否被赋值过 int v;//结点值 Node* left, *right;Node():have_value(false),left(NULL),right(NULL){}//构造函数
};Node* root;//二叉树的根结点 Node* newnode() { return new Node(); }//需要node就申请一个新的node bool failed;
void addnode(int v, char* s) {//添加结点 ,建树 int n = strlen(s);Node* u = root;//从根节点开始往下走 for(int i = 0; i < n; 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;// 做标记
}void remove_tree(Node* u) {//释放二叉树的代码 if(u == NULL) return;//提前判断 remove_tree(u->left);//释放左子树空间 remove_tree(u->right);// 释放右子树空间 delete u;//调用析构函数,释放u结点本身内存
}char s[maxn];//保存读入结点 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() {vector<int> ans;while(read_input()) {if(!bfs(ans)) failed = 1;if(failed) printf("not complete\n");else {for(int i = 0; i < ans.size(); i++) {if(i != 0) printf(" ");printf("%d", ans[i]);}printf("\n");}}return 0;
}

(二叉树的动态创建与bfs)树的层次遍历相关推荐

  1. UVA122 树的层次遍历 Trees on the level(两种方法详解)

    UVA122 树的层次遍历 Trees on the level 输入: (11,LL) (7,LLL) (8,R) (5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) ...

  2. LeetCode——树:层次遍历、前中后序遍历

    LeetCode--树:层次遍历.前中后序遍历 目录 层次遍历 二叉树的层平均值 找树左下角的值 前中后序遍历 概述 非递归实现二叉树的前序遍历 非递归实现二叉树的中序遍历 非递归实现二叉树的后序遍历 ...

  3. C++树的层次遍历(附完整源码)

    C++树的层次遍历 树层次遍历方法如下 1.方法1 2.方法2 树层次遍历方法如下 1.方法1 void LevelOrder(Tree* root) {if (root == nullptr)ret ...

  4. 数据结构之栈的应用:树的层次遍历、图的广度优先遍历、OS的FCFS策略

    栈的应用:树的层次遍历.图的广度优先遍历.OS的FCFS策略 树的层次遍历: 图的广度优先遍历 OS的FCFS策略: 树的层次遍历: 算法思想: 1.先遍历头节点1,头节点1入队 2.在遍历头节点的孩 ...

  5. 二叉树的先序/中序/后序/层次遍历

    [简介] 树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用. 二叉树是每个结点最多有两个子树的有序树.通常子树的根被称作"左子树"(left subtree)和&quo ...

  6. 二叉树(C++):创建,前中后序遍历(递归+非递归),获取叶子节点个数,获取树的高度

    文章目录 前言 创建二叉树 先序遍历 中序遍历 后序遍历 获取叶子节点个数 获取树的高度 测试代码 前言 现有如下二叉树: 关于二叉树的相关操作,我们能够发现二叉树从根节点到子节点,以及每个中间节点基 ...

  7. java 树的层次遍历_Java遍历树的层级 - osc_jegm3yg5的个人空间 - OSCHINA - 中文开源技术交流社区...

    非科班出身,欢迎指正. 要实现的逻辑是,在一棵树中,给出任意一个节点,获取到该节点下的N个层级. 一.树型结构 下图的树中,节点上的字母代表节点的名字,字母下的代表该节点的下单金额. 二.数据准备 组 ...

  8. 树与树算法二叉树的层次遍历/广度遍历/深度遍历详解与代码实现

    一. 树与树算法 1.1树的概念   树(tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合.它是由n(n>=1)个有限节点组成一个具有 ...

  9. 【数据结构和算法】广度优先BFS遍历图(树的层序遍历的拓展)

    目录 ○树的层次遍历: 题:leetcode102: 广度优先优先遍历: 代码模板(来源:labuladong算法小抄): 图的广度优先遍历是树的层次遍历的拓展 ○树的层次遍历: 按照数的高度从上到下 ...

最新文章

  1. 【动态规划】最长公子序列 - dp
  2. 关于 mysql 在联合查询时,使用 concat 拼接查询条件
  3. groovy 对 list 排序
  4. mysql数据库最多列_mysql多列索引和最左前缀
  5. 学习 openssl 证书命令
  6. 九度oj 题目1325:Battle Over Cities
  7. 按钮 加加加 减减减
  8. matlab 批量取消注释,MATLAB中多行注释以及取消的快捷键
  9. Python笔记 :科赫雪花曲线(计算思维训练1)
  10. qpython3.7.4版本下载_QPython3app下载
  11. react-native实现支付宝支付
  12. 推荐一款文献管理工具 Zotero |附使用教程和学习路径
  13. 创建自己的WordPress主题的三种方法
  14. Latex制作beamer幻灯片、写论文的基本语句
  15. 第一节、同步回调和异步回调?
  16. 你的登录接口真的安全吗?
  17. 计算机游戏的作文,描写电脑游戏的优秀作文300字(通用3篇)
  18. 2023年Android现代开发
  19. 大数据之Spark:Spark Core(1)
  20. 关于Android开发工程师的从业预期与自我要求

热门文章

  1. 华为交换机如何通过tftp服务器上传下载文件
  2. NuGet Error:Unable to find version ‘0.3.3.0‘ of package ‘glog.overlay-x64_v120_Release_dynamic‘.
  3. 传播时延、发送时延、处理时延和排队时延各自的物理意义是什么?
  4. css怎样使弹跳的小球旋转,如何使用纯CSS实现小球跳跃台阶的动画效果(附源码)...
  5. mysql怎样实现先判断后联合_MYSQ创建联合索引,字段的先后顺序,对查询的影响分析...
  6. java smp_什么是SMP系统
  7. python将列表中反序输出_python中sorted怎么反序排列
  8. 吉大计算机学院刘淑芬,刘淑芬-吉林大学计算机科学与技术学院
  9. linux的内置的账户_6 款面向 Linux 用户的开源绘图应用程序
  10. c语言中怎么暂停一个一个游戏,求助:最近在linux下用c语言写了一个贪吃蛇程序,有几个问题,第一:贪吃蛇怎么实现暂停,第二:有时候同时输入上下左右中的两个键就会直接游戏结束...