博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVa 11234 Expressions 二叉树 层次遍历 广搜
阅读量:4074 次
发布时间:2019-05-25

本文共 2708 字,大约阅读时间需要 9 分钟。

FILE 1181
50.55%
471
89.60%

题目链接:

题目类型: 数据结构, 二叉树

题目大意:

一般情况下,都是中缀操作符, 如x+y。然后题目给出了一种后缀操作符的形式, 变成 x y +。 进行后缀操作可以用栈模拟,使用push,pop, 过程和经典的“括号匹配”差不多。 然后要求我们转换成队列的方式,用队列的push和pop(队列的和栈的区别).

解体思路:

一开始没思路, 后来觉得听说是要建树。 这题也是我写的第一道二叉树题。

题目的最关键部分是进行二叉树建树,  以及层次遍历逆序输出,还有利用栈的“括号匹配”思想。 二叉树的基本结构是,父结点都是操作符,子节点都是数字。 对于给出的序列, 从左到右遍历,遇到代表数字的小写则建立一个无儿子的树,然后把根结点指针入栈, 遇到代表操作符的大写字母,则从栈中弹出两个根结点,然后建立一个以大写字母为根,弹出的两个操作数为左右儿子的树,再把这个新树的根结点指针压入栈。如此循环下去。 最后,在栈顶的那个指针就是最后建成的树的根结点。  然后对这颗树进行层次遍历把字母取出来,最后逆序输出即可。

样例输入:

2xyPzwIMabcABdefgCDEF

样例输出:

wzyxIPMgfCecbDdAaEBF

代码:

1. 数组版

10278049 Accepted C++ 1.512 2012-07-01 12:59:01

#include
#include
#include
#include
#include
#include
using namespace std;class Node{public: char data; int left; int right;};stack
st;queue
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
=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
#include
#include
#include
#include
#include
using namespace std;class Node{public: char data; Node* left; Node* right;};stack
st;queue
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
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;}

——      生命的意义,在于赋予它意义。 
                   原创 
 , By   D_Double

转载地址:http://luzni.baihongyu.com/

你可能感兴趣的文章
获取.fla所有导出类名称列表的方法
查看>>
关于FLASH 3D游戏的想法,做一个双人合作射击的游戏,
查看>>
PNG图片优化技术(一)
查看>>
photoshop 优化 PNG 图片尺寸大小 终极秘技!
查看>>
mmo游戏开发应在profile下运行,才能保证正式运行不卡
查看>>
关于Flash CS3创建Sprite类型的问题
查看>>
AS3通俗教程---AS3自身loading制作
查看>>
0 bytes after compression出现的情况
查看>>
内存回收专题
查看>>
[资料] 史上最强的伯克利大学1024线飞龙AI下载地址,有没有人有兴趣来测试一手?...
查看>>
Discuz多人斗地主积分版,消耗论坛积分的斗地主
查看>>
discuz X2斗地主积分版插件安装方法(用户版)
查看>>
ASP.NET程序也能像WinForm程序一样运行
查看>>
听到两个程序员聊天——A:“借我1K块。”
查看>>
轻松搭建一个Windows SVN服务器
查看>>
Discuz X2多人斗地主[消耗论坛积分]小体积版本,仅25MB!
查看>>
大型多人在线MMO RPG游戏最重要的二个职位
查看>>
NVIDIA_Fermi_GPU架构简单解析(转)
查看>>
以前看过一个压缩过的.exe,运行会播放长达半小时的动画,却只有60KB,个人认为其中的原理...
查看>>
给vs2012轻松换肤
查看>>