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(模拟内存池解法)相关推荐

  1. 【日常学习】【指针二叉树+BFS】Uva - 122 Trees on the level题解

    作为一个传统型的树盲,不得不把树重新学习一次.通常我是不太喜欢指针的,但这样写下来感觉还能接受. 题目来源是ACM DUKE 1993 Uva 122 杭电也有这道题  这道题目基本是照着ruka抄来 ...

  2. [UVa 122] Trees On the Level

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

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

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

  4. UVa 122 Trees on the level

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

  5. 模拟linux文件系统的设计及实现_Linux后台服务器开发中,内存池设计与实现(c/c++)...

    一.前言 作为C++程序员,想必对于内存操作这一块是比较熟悉和操作比较频繁的: 比如申请一个对象,使用new,申请一块内存使用malloc等等: 但是,往往会有一些困扰烦恼着大家,主要体现在两部分: ...

  6. 模拟内存计算如何解决边缘人工智能推理的功耗挑战

    模拟内存计算如何解决边缘人工智能推理的功耗挑战 How analog in-memory computing can solve power challenges of edge AI inferen ...

  7. Memcached内存池分析

    针对Memcacged1.4.15代码 1.完整slabs内存池图 这是我画的memcached的slabs内存池对象关系图: 2.内存池数据结构 typedef struct {unsigned i ...

  8. 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) ...

  9. (转载)简单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 ...

最新文章

  1. Scheme来实现八皇后问题(2)
  2. 20分钟学会mysql_5分钟学会mysql基本操作
  3. python知识:稀疏矩阵转换成密度矩阵
  4. 【攻防世界017】re4-unvm-me
  5. [IE 技巧] 显示/隐藏IE 的菜单/工具栏
  6. 计算机辅助教育会议,子会议1:学习科学、计算机辅助合作学习、智慧教育
  7. 再见c罗再见梅西_再见,再见,5 * 60 * 1000 //五分钟,再见,再见
  8. asp.net ViewState详解
  9. 9206-1121-对象数组
  10. Flutter PageView左右滑动切换视图
  11. markdown简明使用语法
  12. Vue调用本地缓存(监视数据变更)
  13. 9.2 配置rsync+inotify实时同步
  14. 《工业设计史》第十章:战后重建与设计
  15. 计算机程序员三级试题,计算机程序员考试试题及答案.
  16. Ember.js和Vue.js对比,哪个框架更优秀?
  17. Mysql大文本类型
  18. PS制作搞笑印章 - 仿真印章 - 水印滤色
  19. Angular primeng tree 组件数据解析(适用于Angular2+)
  20. 超搞笑MSN名字大集合(转贴)

热门文章

  1. 【Java】说明变量作用域的示例程序
  2. Orace用户创建及权限分配
  3. mysql innodb引擎数据存储方式和索引的概念
  4. word 职称计算机考试大纲,全国职称计算机考试Word2003大纲.doc
  5. 笔记本电脑锁_武汉笔记本电脑模型打样价格
  6. simulink模块使用记录2-EnabledSubsystem/merge
  7. SpringBoot-异常处理
  8. jQuery进阶部分笔记
  9. Flask Jinja2 模板中的变量和过滤器
  10. win下anaconda装python2.7和3.5以及jupyter共存 (本篇实践通过)