二叉树层次遍历
2016-04-15 10:42
429 查看
遗忘 --- 真是一件迷人的事儿。 ---- 某无耻乐观的小逗比
// 题目: UVA 122 /* 问题描述: 输入一个二叉树(如示例)。 ()空括号是一组输入结束的标志 要求输出: 按从上到下, 从左到右的顺序,输出结点值。 即:层次遍历。 解决方案: 建树 ----> bfs遍历 示例: 输入:(3,L) (4,R) (5,) () 输出: 5 3 4 5 / \ 3 4 */
#include <cstdio> #include <cstdlib> #include <queue> #include <vector> #include <cstring> #include <fstream> using namespace std; const int maxn = 1000 + 10; // 二叉树结构体 struct Node{ bool have_value; // 是否被赋值过 int v; // 节点值 Node *left, *right; Node():have_value(false), left(NULL), right(NULL) { } // 构造函数 }; char s[maxn]; // 保存读入结点 int failed; Node* root; Node* newnode(); // 申请新结点 void remove_tree(Node* u); // 释放树 void addnode(int v, char * s); // 添加结点 bool read_input(); // 输入 bool bfs(vector<int>& ans); // BFS层次遍历 int main() { vector<int> ans; vector<int>::iterator it; while(read_input()) { if(!bfs(ans)) failed = 1; if(failed) printf("not complete\n"); else { for(it = ans.begin(); it != ans.end(); it++) { if(it != ans.begin()) printf(" "); printf("%d", *it); } printf("\n"); } } return 0; } Node* newnode() { return new Node(); } void remove_tree(Node* u) { if( u == NULL) return; remove_tree(u->left); remove_tree(u->right); delete u; } bool read_input(){ failed = false; 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; } 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 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; // 输入正确 }
Talk is cheap, Reading is cheap. Just do it!
相关文章推荐
- C#+ AE 注意问题汇总(不断更新)
- MFC线程编程
- 插入排序
- 解决org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'localSessi
- mybatis缓存
- EditPlus配置C#编译及运行环境
- 计算出字符串中出现次数最多的字符是什么,出现了多少次
- 张孝祥Java面试宝典学习笔记---软件工程与设计模式(23种)
- PendingIntent的内部机制
- 如何实现Imageview图片进行缩放
- 2016,4,15,角色管理的增删改查
- jQuery ztree 下载
- 在android整机环境下,不去strip,添加调试信息
- 网格弹簧质点系统模拟(Spring-Mass System by Verlet Integration)附源码
- 裁剪要素出现错误 :HRESULT:0x80040239
- 品读Java String类
- 各种nosql数据库的比较Cassandra,MongoDB,CouchDB,Redis,Riak,HBase
- SpatialHadoop实例:面向空间数据的高效MapReduce框架
- MySQL 数据导入,导出
- 最新版webstorm 2016.1破解方法