122 - Trees on the level(模拟内存池解法)
PS:题目和动态分配内存解法,可以查看:122 - Trees on the level(动态分配空间解法)
PS:模拟内存池的原理简单的说就是先初始化一个空闲队列,当需要资源时,直接从队首获取,当资源释放不用时,又将该资源加入空闲队列队尾。
#include <iostream>
#include <queue>
#include <string>
#include <sstream>
#include <vector>using namespace std;const int maxNum = 256 + 5;// 二叉树节点类型
struct Node {// 是否被赋值bool isAssign;// 值int value;// 左子节点Node *left;// 右子节点Node *right;
};// 根节点
Node *root;bool failed;// 内存池
// 空闲节点队列
queue<Node *> freeNodes;
// 内存池中的结点都是从该数组中获取的
Node node[maxNum];// 初始化内存池
void init() {for(int i = 0; i < maxNum; i++) {freeNodes.push(&node[i]);}
}// 从内存池中取一个节点
Node* newNode() {Node *p = freeNodes.front();// 重新初始化该节点p->left = p->right = NULL;p->isAssign = false;freeNodes.pop();return p;
}// 将使用完毕的节点重新加入这个内存池
void deleteNode(Node *p) {freeNodes.push(p);
}// 释放树结点
void removeTree(Node *root) {if(root == NULL) {return;}// 释放左子树if(root->left != NULL) {removeTree(root->left);}// 释放右子树if(root->right != NULL) {removeTree(root->right);}// 因为使用内存池技术// 所以会将结点回收再次放回内存池deleteNode(root);
}// 插入节点
void insertNode(int value , string seq) {Node *p = root;for(int i = 0; i < seq.length(); i++) {// 插入左子树if('L' == seq[i]) {if(p->left == NULL) {p->left = newNode();}p = p->left;} else if('R' == seq[i]) {// 插入右子树if(p->right == NULL) {p->right = newNode();}p = p->right;}}// 插入重复节点if(p->isAssign) {failed = true;}p->value = value;p->isAssign = true;
}// 宽度优先遍历
// 返回false表示有节点未赋值
bool bfs(vector<int> &ans) {Node *p;// 入栈根节点queue<Node*> q;q.push(root);// 清空上一次序列ans.clear();while(!q.empty()) {p = q.front();q.pop();if(!p->isAssign) {return false;}if(p->left != NULL) {// 入栈左子节点q.push(p->left);}if(p->right != NULL) {// 入栈右子节点q.push(p->right);}// 放入序列ans.push_back(p->value);}return true;
}int main() {string s;// 初始化内存池init();// 层次遍历序列容器vector<int> ans;while(true) {// 清除上一棵树的结点removeTree(root);// 初始化failed = false;root = newNode();while(true) {cin >> s;// 文件末尾,退出if(cin.eof()) {return 0;}// ()情况,停止添加结点if(')' == s[1]) {break;}// 找到','的位置int pos = s.find(',');// 截取valueint val;istringstream iss;iss.str(s.substr(1, pos - 1));iss >> val;// 插入节点insertNode(val , s.substr(pos + 1, s.length() - pos - 2));}// 获取层次遍历序列if(!bfs(ans)) {failed = true;}if(failed) {cout << "not complete" << endl;} else {for(int i = 0; i < ans.size(); i++) {if(i) {cout << " ";}cout << ans[i];}cout << endl;}}return 0;
}
122 - Trees on the level(模拟内存池解法)相关推荐
- 【日常学习】【指针二叉树+BFS】Uva - 122 Trees on the level题解
作为一个传统型的树盲,不得不把树重新学习一次.通常我是不太喜欢指针的,但这样写下来感觉还能接受. 题目来源是ACM DUKE 1993 Uva 122 杭电也有这道题 这道题目基本是照着ruka抄来 ...
- [UVa 122] Trees On the Level
Trees On the Level 竟然还有 (,) () 这种东西!!! #include <cstdio> #include <cstring> #include < ...
- UVA 122 Trees on the level 二叉树 广搜
题目链接: https://vjudge.net/problem/UVA-122 题目描述: 给你一种二叉树的构造方法, 让你逐层输出二叉树的节点值, 如果不能够则输出"not comple ...
- UVa 122 Trees on the level
题意:给出一棵二叉树,按照从上到下,从左到右输出所有节点的值,如果有一个节点没有赋值或者被多次赋值则输出not complete 看的紫书照着敲的= = 先要将输入进来的值建成一颗二叉树(定义一个二叉 ...
- 模拟linux文件系统的设计及实现_Linux后台服务器开发中,内存池设计与实现(c/c++)...
一.前言 作为C++程序员,想必对于内存操作这一块是比较熟悉和操作比较频繁的: 比如申请一个对象,使用new,申请一块内存使用malloc等等: 但是,往往会有一些困扰烦恼着大家,主要体现在两部分: ...
- 模拟内存计算如何解决边缘人工智能推理的功耗挑战
模拟内存计算如何解决边缘人工智能推理的功耗挑战 How analog in-memory computing can solve power challenges of edge AI inferen ...
- Memcached内存池分析
针对Memcacged1.4.15代码 1.完整slabs内存池图 这是我画的memcached的slabs内存池对象关系图: 2.内存池数据结构 typedef struct {unsigned i ...
- 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) ...
- (转载)简单linux C++内存池
C++代码 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 ...
最新文章
- Scheme来实现八皇后问题(2)
- 20分钟学会mysql_5分钟学会mysql基本操作
- python知识:稀疏矩阵转换成密度矩阵
- 【攻防世界017】re4-unvm-me
- [IE 技巧] 显示/隐藏IE 的菜单/工具栏
- 计算机辅助教育会议,子会议1:学习科学、计算机辅助合作学习、智慧教育
- 再见c罗再见梅西_再见,再见,5 * 60 * 1000 //五分钟,再见,再见
- asp.net ViewState详解
- 9206-1121-对象数组
- Flutter PageView左右滑动切换视图
- markdown简明使用语法
- Vue调用本地缓存(监视数据变更)
- 9.2 配置rsync+inotify实时同步
- 《工业设计史》第十章:战后重建与设计
- 计算机程序员三级试题,计算机程序员考试试题及答案.
- Ember.js和Vue.js对比,哪个框架更优秀?
- Mysql大文本类型
- PS制作搞笑印章 - 仿真印章 - 水印滤色
- Angular primeng tree 组件数据解析(适用于Angular2+)
- 超搞笑MSN名字大集合(转贴)
热门文章
- 【Java】说明变量作用域的示例程序
- Orace用户创建及权限分配
- mysql innodb引擎数据存储方式和索引的概念
- word 职称计算机考试大纲,全国职称计算机考试Word2003大纲.doc
- 笔记本电脑锁_武汉笔记本电脑模型打样价格
- simulink模块使用记录2-EnabledSubsystem/merge
- SpringBoot-异常处理
- jQuery进阶部分笔记
- Flask Jinja2 模板中的变量和过滤器
- win下anaconda装python2.7和3.5以及jupyter共存 (本篇实践通过)