UVa 11234 Expressions 二叉树 层次遍历 广搜
来源:互联网 发布:手机淘宝支付流程图 编辑:程序博客网 时间:2024/04/30 02:53
11234 - Expressions1181471
—— 生命的意义,在于赋予它意义。
50.55%
89.60%
题目链接:
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=103&page=show_problem&problem=2175
题目类型: 数据结构, 二叉树
题目大意:
一般情况下,都是中缀操作符, 如x+y。然后题目给出了一种后缀操作符的形式, 变成 x y +。 进行后缀操作可以用栈模拟,使用push,pop, 过程和经典的“括号匹配”差不多。 然后要求我们转换成队列的方式,用队列的push和pop(队列的和栈的区别).
解体思路:
一开始没思路, 后来觉得听说是要建树。 这题也是我写的第一道二叉树题。
题目的最关键部分是进行二叉树建树, 以及层次遍历逆序输出,还有利用栈的“括号匹配”思想。 二叉树的基本结构是,父结点都是操作符,子节点都是数字。 对于给出的序列, 从左到右遍历,遇到代表数字的小写则建立一个无儿子的树,然后把根结点指针入栈, 遇到代表操作符的大写字母,则从栈中弹出两个根结点,然后建立一个以大写字母为根,弹出的两个操作数为左右儿子的树,再把这个新树的根结点指针压入栈。如此循环下去。 最后,在栈顶的那个指针就是最后建成的树的根结点。 然后对这颗树进行层次遍历把字母取出来,最后逆序输出即可。
样例输入:
2xyPzwIMabcABdefgCDEF
样例输出:
wzyxIPMgfCecbDdAaEBF
代码:
1. 数组版
1027804911234ExpressionsAcceptedC++1.5122012-07-01 12:59:01#include<iostream>#include<cstdio>#include<cctype>#include<cstring>#include<stack>#include<queue>using namespace std;class Node{public: char data; int left; int right;};stack<int>st;queue<int>qu;Node arr[10005];char str[10005];int result[10005], resultIndex;// 进行广搜层次遍历void bfs(int root){ while(!qu.empty()) qu.pop(); qu.push(root); result[resultIndex++]=arr[root].data; while(!qu.empty()){ int t = qu.front(); qu.pop(); if(arr[t].left != -1){ result[resultIndex++] = arr[arr[t].left].data; qu.push(arr[t].left); } if(arr[t].right != -1){ result[resultIndex++] = arr[arr[t].right].data; qu.push(arr[t].right); } }}void Solve(){ while(!st.empty()) st.pop(); for(int i=0; i<strlen(str); ++i){ if(islower(str[i])){ st.push(i); arr[i].data = str[i]; arr[i].left = -1; arr[i].right = -1; } else{ int right = st.top(); st.pop(); int left = st.top(); st.pop(); arr[i].data = str[i]; arr[i].left = left; arr[i].right = right; st.push(i); } } // 按层次遍历,把字母存在一个栈上(为了逆序输出),然后输出 resultIndex = 0; bfs(st.top()); // 按广搜结果的逆序输出 for(int i=resultIndex-1; i>=0; --i) printf("%c",result[i]); printf("\n");}int main(){ freopen("input.txt","r",stdin); int T; scanf("%d",&T); while(T--){ scanf("%s",str); Solve(); } return 0;}
2. 指针动态内存分配版
#include<iostream>#include<cstdio>#include<cctype>#include<cstring>#include<stack>#include<queue>using namespace std;class Node{public: char data; Node* left; Node* right;};stack<Node*>st;queue<Node*>qu;char str[10005];int result[10005], resultIndex;// 进行广搜层次遍历void bfs(Node* root){ while(!qu.empty()) qu.pop(); qu.push(root); result[resultIndex++]=root->data; while(!qu.empty()){ Node* t = qu.front(); qu.pop(); if(t->left != NULL){ result[resultIndex++] = t->left->data; qu.push(t->left); } if(t->right != NULL){ result[resultIndex++] = t->right->data; qu.push(t->right); } }}void Solve(){ while(!st.empty()) st.pop(); for(int i=0; i<strlen(str); ++i){ if(islower(str[i])){ Node *temp = new Node; temp->data = str[i]; temp->left = NULL; temp->right = NULL; st.push(temp); } else{ Node* right = st.top(); st.pop(); Node* left = st.top(); st.pop(); Node* parent = new Node; parent->data = str[i]; parent->left = left; parent->right = right; st.push(parent); } } // 按层次遍历,把字母存在一个栈上(为了逆序输出),然后输出 resultIndex = 0; bfs(st.top()); // 按广搜结果的逆序输出 for(int i=resultIndex-1; i>=0; --i) printf("%c",result[i]); printf("\n");}int main(){ freopen("input.txt","r",stdin); int T; scanf("%d",&T); while(T--){ scanf("%s",str); Solve(); } return 0;}
—— 生命的意义,在于赋予它意义。
原创 http://blog.csdn.net/shuangde800 , By D_Double
- UVa 11234 Expressions 二叉树 层次遍历 广搜
- UVA 11234 - Expressions 二叉树建树+BFS 层次遍历
- Uva 11234 Expressions (二叉树的层次遍历)
- uva 11234 Expressions(建立二叉树+层次遍历)
- UVa 11234 Expressions (二叉树重建&由叶往根的层次遍历)
- [UVA 11234] Expressions (二叉树的建立与层次遍历)
- uva 11234 Expressions 表达式 建树+BFS层次遍历
- 广搜遍历二叉树
- Binary Tree Level Order Traversal II 二叉树层次遍历(广搜,queue)(重重)
- Uva 11234 - Expressions//数据结构,二叉树
- uva 11234 Expressions(后缀变层次)
- 层次遍历二叉树
- 层次遍历二叉树
- 二叉树层次遍历
- 二叉树 层次遍历
- 二叉树层次遍历
- 层次遍历二叉树
- 二叉树层次遍历
- wxPython布局管理
- HTML5与HTML4的10个关键区别
- 堆排序
- mini2440 dev issues
- 常用算法思想--递推算法
- UVa 11234 Expressions 二叉树 层次遍历 广搜
- 捐一个亿的是加多宝,不是王老吉!只喝加多宝,不喝王老吉!
- windows xp emacsclientw 不起作用
- 跳跃表数据结构
- 《学习OpenCV》第二章(3)
- 腾讯登录加密方式的java实现
- 设计模式学习(2)
- HttpClient4模拟登录腾讯微博及分享功能
- 如何快速成为javascript高手?