作为一个传统型的树盲,不得不把树重新学习一次。通常我是不太喜欢指针的,但这样写下来感觉还能接受。

题目来源是ACM DUKE 1993 Uva 122 杭电也有这道题  这道题目基本是照着ruka抄来的,Uva这两天天天上不去,华科的VJ也没法用,与使用杭电测了一下

第一次在Uva测的时候,奇怪的WA了,在杭电测是PE(我人生中第一个PE···),然后才发现换行符输出的位置错了,我在最后一个else里没有加块 直接导致输出完毕not complete后会连着输出两个换行符。Uva好像没有PE这样可喜可贺的东西啊。

题目刚开始我根本不知如何下手,ruka的思路是先用字符串读入,再从字符串中读数字;递归建立指针链表,每一个L就开一个新的指针left,在读入过程中不判重,程序运行过程中用failed判重和判断是否为空。整个程序结构和思路非常清晰。

学习到的一点语法小贴士:

1.对于指针变量a,a->x就是*a.x  前星后点 不如箭头简单

2.指针的定义,Node *left,*right   刚开始里奥告诉我Node* 后面就不用加星号 但如果直接Node 后面每个变量都要加星号  但是尝试了一下发现只能在每个变量前都加星号。

3.不得不深深佩服ruka君,代码简洁明了,结构非常清晰,主程序中写思路,用到一个程序就写一个块。我要学习这种做法。

那么,放代码

//Uva 122 Duke 1993 Trees on the level
//link list struct#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
using namespace std;
bool failed;
struct Node{bool have_value;int v;Node *left,*right;//递归构建指针链表二叉树Node():have_value(false),left(NULL),right(NULL){}//构造函数,析构函数如果不写由程序默认提供,注意构造函数只能通过new使用,析构函数是delete
};Node* root;Node* newnode(){return new Node();//申请新空间,同时调用构造函数初始化
}void remove_tree(Node* u){//just try &试一下传引用是否可以,事实上可以ACif (u==NULL) return;//提前判断remove_tree(u->left);//递归释放空间remove_tree(u->right);delete u;//析构
}void addnode(int v,char* s){//in fact char* is a string,it's the first char's addressint n=strlen(s);Node* u=root;//从根往下for (int i=0;i<n;i++){//if it's NULL it won't run this step如果是空的,不会走这一步,但这样不是错误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;
}char s[300];
bool read_input(){//while reading do not check legitimacy读入函数,读入时不检查是否有误,但每次读入重新设定布尔变量初值failed=false;remove_tree(root);//清空树,释放空间(析构函数)root=newnode();//创建根节点,此处调用构造器初始化(构造函数)for (;;){if (scanf("%s",s)!=1) return false;//整个读入结束if (!strcmp(s,"()")) break;//strcmp函数,比较两个串,s1<s2返回负,相等为0,大于为正,注意返回值不一定int v;sscanf(&s[1],"%d",&v);//sscanf是已经读入了c串s,然后从s中读入,输入源由键盘变成了c字符串,以%d形式读到v中,注意c字符串把任意指向字符的指针看做字符串的起始位置,因此这里相当于是读入了从字符串第二位开始的新串addnode(v,strchr(s,',')+1);//查找逗号,返回逗号的指针+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】Uva - 122 Trees on the level题解相关推荐

  1. [UVa 122] Trees On the Level

    Trees On the Level 竟然还有 (,) () 这种东西!!! #include <cstdio> #include <cstring> #include < ...

  2. UVA 122 Trees on the level 二叉树 广搜

    题目链接: https://vjudge.net/problem/UVA-122 题目描述: 给你一种二叉树的构造方法, 让你逐层输出二叉树的节点值, 如果不能够则输出"not comple ...

  3. UVa 122 Trees on the level

    题意:给出一棵二叉树,按照从上到下,从左到右输出所有节点的值,如果有一个节点没有赋值或者被多次赋值则输出not complete 看的紫书照着敲的= = 先要将输入进来的值建成一颗二叉树(定义一个二叉 ...

  4. 122 - Trees on the level(模拟内存池解法)

    PS:题目和动态分配内存解法,可以查看:122 - Trees on the level(动态分配空间解法) PS:模拟内存池的原理简单的说就是先初始化一个空闲队列,当需要资源时,直接从队首获取,当资 ...

  5. 广度优先遍历二叉树(BFS)-C++实现

    1 // 广度优先遍历二叉树(BFS).cpp: 定义控制台应用程序的入口点.2 //3 4 #include "stdafx.h"5 6 7 #include <iostr ...

  6. 日常学习随笔-数组、单链表、双链表三种形式实现队列结构的基本操作(源码注释)...

    一.队列结构(本文侧重于源码实现,基础理论不多赘述) 和栈一样,队列(queue)也是表,然而使用队列是在一端插入数据,在另一端删除数据.这里插入就是入队(enqueue),删除就是(dequeue) ...

  7. 深入了解,学习线索二叉树

    学习线索二叉树 何谓二叉树 线索二叉树的诞生--中序序列 线索的价值 线索的建立 线索的问题 线索化二叉树节点结构 线索二叉树建立 总结 何谓二叉树 二叉树(binary tree)是指树中节点的度不 ...

  8. Android:日常学习笔记(8)———探究UI开发(2)

    Android:日常学习笔记(8)---探究UI开发(2) 对话框 说明: 对话框是提示用户作出决定或输入额外信息的小窗口. 对话框不会填充屏幕,通常用于需要用户采取行动才能继续执行的模式事件. 提示 ...

  9. Android:日常学习笔记(6)——探究活动(3)

    Android:日常学习笔记(6)--探究活动(3) 活动的生命周期 返回栈 Android中的活动是可以叠加的,我们每启动一个新活动,就会覆盖在原来的活动上,点击Back以后销毁最上面的活动,下面的 ...

最新文章

  1. opencv补全边缘_为什么OpenCV中绘制的轮廓不能填充图像边缘的轮廓?
  2. spring 缓存(spring自带Cache)(入门)源码解读
  3. java protected关键字_Java 权限protected关键字纠正
  4. 首次公开!单日600PB的计算力--阿里巴巴EB级大数据平台的进击
  5. mysql主从虚拟机_虚拟机centos7Mysql实现主从配置
  6. php 发送短信 sms,php 调用百度sms来发送短信的实现示例
  7. 越狱Season 1-Episode 15: By the Skin and the Teeth
  8. python自助电影售票机_手把手教你用python抢票回家过年(代码简单)
  9. 监控mysql锁定状态_Shell脚本监控MySQL主从状态
  10. 一个可以把单张静态照片转化成 3D 图片的AI 工具
  11. 如何设置VSCode删除整行快捷键?
  12. sow工作任务说明书例子
  13. Bug敏感度与软件质量关系
  14. 百度朱光:将技术基因注入百度金融,是我们未来三五年要做的事
  15. 关于GPS经纬度如何转百度经纬度
  16. 15天精读掌握《高德纳_具体数学》 第11天 2019.6.7
  17. 双十一来袭,想要掌控售卖数据,为何不试试智慧商场可视化系统?
  18. xp计算机找不到音量调节,XP系统桌面右下角的音量开关图标不见了,怎么恢复?...
  19. 权利的角斗场中 Web3 终将得胜
  20. 我的 计算机朋友作文,我的电脑朋友作文

热门文章

  1. 使用 BigDecimal 进行浮点数运算
  2. HTML网页之坦克大战游戏
  3. Codeforces Round #335 (Div. 2) D. Lazy Student 构造
  4. 【BMS】电池能量管理:充电管理
  5. Android Senser 使用方式
  6. c语言之字母大小转换
  7. 《炬丰科技-半导体工艺》光刻胶回流特性在金刚石微透镜制造中的应用
  8. NMS(non maximum suppression )
  9. 行政区划sql数据脚本
  10. Android搭建ftp服务器/客户端