UVa 11234 - Expressions
来源:互联网 发布:京都特色民宿酒店知乎 编辑:程序博客网 时间:2024/04/30 03:04
传送门UVa 11234 - Expressions
一开始没思路, 后来看到有人一句话概述了方法, 然后自己捉摸了一下, 就想到了.
只要大家把输入倒着看, 就是一个先遍历根节点右子树再遍历左子树的" 先序遍历", 叶子就是小写字母, 然后输出就是层次输出, 但顺序是倒着的, 所以我用栈存储最后的答案.
估计大家看着也不是很明白, 不过只要把Sample Data画一下就很直观了, 也可以参考一下这篇文章, 树画出来的样子如下, 只不过他的方法太复杂了, 用并树来建树.
CSDN说有被禁用的URL... 等我联系了客服再加上链接.. 话说最近CSDN老出问题.(╯‵□′)╯ ┴─┴
因为题目说输入可能有10000, 为了避免浪费空间一咬牙用string写了... 然后就习惯性加上了printf, CE了一次...
详情见代码
#include <iostream>#include <string>#include <cctype>#include <queue>#include <stack>using namespace std;struct Node{ char c; Node *left, *right; Node(char v) { left = right = 0; c = v; }};stack<char> ans;queue<Node *> scan;string str;int i;Node *Build();void BFS(Node *root);void Output();int main(){//freopen("input.txt", "r", stdin); int n;cin >> n; while (n--) { cin >> str; i = str.size() - 1; //建树. Node *root = Build(); //层次遍历输出. scan.push(root); //先把根节点放入队列. BFS(root);Output(); } return 0;}Node *Build(){Node *root = new Node(str[i]); if (islower(str[i])) //如果当前值是小写字母, 说明没有左右子树了. {i--; return root;}i--; root->right = Build(); root->left = Build();return root;}void BFS(Node *root){Node *now;while (!scan.empty()){now = scan.front();if (scan.front()->left)//如果当前结点有左子树. 因为有左子树必有右子树.{ans.push(now->left->c);//接下来两个结点进栈.ans.push(now->right->c);scan.push(now->left);//放队列里scan.push(now->right);scan.pop();//当前结点出队.}elsescan.pop();//不然的话当前结点就是小写字母, 直接出队.}}void Output(){while (!ans.empty()){cout << ans.top();ans.pop();}cout << str[str.size() - 1];cout << endl;}
0 0
- UVa 11234 Expressions
- uva 11234 - Expressions
- UVa 11234 Expressions
- uva 11234 - Expressions
- UVa 11234 - Expressions
- UVA 11234 - Expressions
- UVa 11234 - Expressions
- UVA 11234 - Expressions
- uva 11234 - Expressions
- UVA 11234 - Expressions
- uva-11234 Expressions
- UVA 11234 Expressions
- UVa 11234 - Expressions
- UVa 11234 Expressions
- UVa 11234 - Expressions
- UVa 11234 Expressions
- UVA - 11234 Expressions
- UVa-11234-Expressions
- C++第9周(春)项目3 - 分数类
- 【读书笔记】代码大全34章:软件工艺主题
- GameObject和gameobject之间的区别
- 打开个人数据库
- boost::serialization 拆分serialize函数
- UVa 11234 - Expressions
- 七种角度分析对应分析方法
- Objective-c学习笔记—— Ubuntu 环境搭建 + HelloWorld
- error C2146: 语法错误 : 缺少“;”(在标识符“RGB2Gray”的前面)
- 面试题 自己实现strcpy 函数
- 11.C语言泛型的支持
- 街道问题_DP
- 【操作系统】进程调度算法
- HDU 2802 F(N) (找循环节)