是否可以把树上结点的编号,然后把二叉树存储在数组中呢?很遗憾如果结点在一条链上,那将是2^256个结点

所以需要采用动态结构

  • 首先要读取结点,建立二叉树addnode()+read_input()承担这样的工作
  • 然后遍历二叉树,读取结点编号输出bfs()

这道题有内存池应用的背景

附链接  http://blog.csdn.net/shawngucas/article/details/6574863

#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
const int maxn=256+5;
bool failed;
char s[maxn];
struct Node{
bool have_value;//是否被赋值过
int v;//结点值
Node *left,*right;
Node():have_value(false),left(NULL),right(NULL){}//构造函数
};
Node* root;//二叉树的根节点,指针类型给了,但是指针是空的
//如果要定义一棵二叉树,一般是要定义一个“结点”类型的struct(如叫Node),
//然后保存树根的指针(Node *root) Node * newnode(){
return new Node();
}
//程序动态申请内存,请注意内存泄漏
void remove_tree(Node *u){
//后序遍历 先递归地把当前结点的左子树删除 再递归地把当前结点的右子树删除完,最后考虑当前结点
if(u==NULL) return ;
remove_tree(u->left);
remove_tree(u->right);
delete u;
/*
//前序遍历
delete u;
remove_tree(u->left);
remove_tree(u->right);
//中序遍历
remove_tree(u->left);
delete u;
remove(u->right);
*/
}
//addnode(11,"LL)")
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;
}
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);//(11,LL)对应11,LL)
addnode(v,strchr(s,',')+1);//查找逗号,然后插入结点
}
return true;
}
//包括用vector ans记录树结点编号的工作
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=true;//最后一层判断输入是否正确
if(failed) printf("not complete\n");
else {
for (int i=0;i<ans.size();i++){
printf(" ");
printf("%d",ans[i]);
}
printf("\n");
}
}
return 0;
}

  

Uva 122 树的层次遍历 Trees on the level lrj白书 p149的更多相关文章

  1. UVa 122 (二叉树的层次遍历) Trees on the level

    题意: 输入一颗二叉树,按照(左右左右, 节点的值)的格式.然后从上到下从左到右依次输出各个节点的值,如果一个节点没有赋值或者多次赋值,则输出“not complete” 一.指针方式实现二叉树 首先 ...

  2. UVa 122 树的层次遍历

    题意: 给定一颗树, 按层次遍历输出. 分析: 用数组模拟二叉树, bfs即可实现层次遍历 #include <bits/stdc++.h> using namespace std; st ...

  3. Trees on the level UVA - 122 (二叉树的层次遍历)

    题目链接:https://vjudge.net/problem/UVA-122 题目大意:输入一颗二叉树,你的任务是按从上到下,从左到右的顺序输出各个结点的值.每个结点都按照从根节点到它的移动序列给出 ...

  4. 树的层次遍历(Trees on the level,UVA 122)

    题目描述: 题目思路: 1.用结构链表来建树 2.用队列来实现层次遍历,当遍历到根节点时,将其子节点压入队列 #include <iostream> #include <cstdli ...

  5. 编程练习:实现树的层次遍历 (CVTE笔试)

    直接层次遍历是比较简单的,但是题目要求的分层打印,这就变得稍微有些麻烦 我是采用两个队列的方法实现. 1.将树结构入队列1. 2.当队列1和队列2都不为空的时候,则一直循环. 3.当队列1不为空的时候 ...

  6. [Swift]LeetCode103. 二叉树的锯齿形层次遍历 | Binary Tree Zigzag Level Order Traversal

    Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...

  7. [Swift]LeetCode107. 二叉树的层次遍历 II | Binary Tree Level Order Traversal II

    Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left ...

  8. 二叉树的锯齿形层次遍历 · Binary Tree Zigzag Level Order Traversal

    [抄题]: 给出一棵二叉树,返回其节点值的锯齿形层次遍历(先从左往右,下一层再从右往左,层与层之间交替进行) [思维问题]: 不知道反复切换要怎么做:用boolean normalOrder当作布尔型 ...

  9. 【遍历二叉树】04二叉树的层次遍历【Binary Tree Level Order Traversal】

    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 给定一个二叉树,返回他的层次遍历的 ...

随机推荐

  1. MongoDB一个基于分布式文件存储的数据库(介于关系数据库和非关系数据库之间的数据库)

    1:MongoDB的官方网址:https://www.mongodb.com   MongoDB的中文社区:http://www.mongoing.com/(老外也很看重中国市场啊,知道大家英语不好, ...

  2. mybatis if test加筛选条件

    最近在项目使用mybatis中碰到个问题 <if test="type=='y'"> and status = 0 </if> 当传入的type的值为y的时 ...

  3. Akka(10): 分布式运算:集群-Cluster

    Akka-Cluster可以在一部物理机或一组网络连接的服务器上搭建部署.用Akka开发同一版本的分布式程序可以在任何硬件环境中运行,这样我们就可以确定以Akka分布式程序作为标准的编程方式了. 在上 ...

  4. 将逗号分隔 的字符串转化成List

    将逗号分隔 的字符串转化成List List<String> parIdListTmp = new ArrayList<String>(); String parIdArray ...

  5. Spring MVC使用样例

    Spring MVC使用样例 步骤1:添加Spring的相关依赖 1 <dependency> 2 3 <groupId>com.alibaba.external</gr ...

  6. ECMAScript 6 中的快捷语法汇总及代码示例

    对于每个 JavaScript 开发人员,快捷语法都是必备技能之一,下面就集中介绍这些快捷语法. 三元运算符 传统写法 const x = 20; let answer; if (x > 10) ...

  7. 我的学习之路_第二十五_javaScript

    Javascript 作用:可以对表单数据进行校验,可以对页面实现一些动态效果 定义: JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型. 它的解释器被称为 ...

  8. 网页在ios下点击无效的原因

    之前在做一个项目的时候,发现元素在ios系统中点击无法触发效果,网上查了一下发现  ios下  如果不是button,input这类标签的话 ,如果有点击事件的话最好给加一个css样式cursor:p ...

  9. Docker镜像构建的两种方式

    关于Docker里面的几个主要概念 这里用个不太恰当的比方来说明. 大家肯定安装过ghost系统,镜像就像是ghost文件,容器就像是ghost系统.你可以拿别人的ghost文件安装系统(使用镜像运行 ...

  10. Chrome浏览器扩展开发系列之十:桌面通知Notification

    Desktop Notification也称为Web Notification,是在Web页面之外,以弹出桌面对话框的形式通知用户发生了某事件.Web Notification于2015.9.10成为 ...