`
king_tt
  • 浏览: 2190118 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

UVa 11234 Expressions 二叉树 层次遍历 广搜

 
阅读更多

FILE 11234-Expressions 1181
50.55%
471
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(队列的和栈的区别).


解体思路:

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

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


样例输入:

2
xyPzwIM
abcABdefgCDEF

样例输出:

wzyxIPM
gfCecbDdAaEBF



代码:

1. 数组版

10278049 11234 Expressions Accepted C++ 1.512 2012-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/shuangde800By D_Double





分享到:
评论

相关推荐

    Z.Expressions.Eval 4.0.68.zip

    《Z.Expressions.Eval 4.0.68:强大的表达式评估库》 在.NET开发领域,Z.Expressions.Eval是一款非常实用的库,主要用于解析和执行动态表达式。该库的最新版本4.0.68引入了对.NET 3.1和.NET 6框架的全面支持,为...

    C# System.Linq.Expressions表达式序列化源码

    2. **遍历表达式树**:通过递归遍历表达式树,将每个节点转化为对应的序列化表示。这通常涉及到访问节点的属性并将其转化为可序列化的格式,如JSON或XML。 3. **序列化**:将这些表示转化为字符串或其他持久化格式...

    Expressions13

    "Expressions13"很可能是一个专注于正则表达式的轻量级测试工具,旨在帮助开发者和爱好者快速验证、调试他们的正则表达式,确保其在实际应用中的正确性。 正则表达式的基本概念: 1. **字符集**:正则表达式由各种...

    MariaDB and MySQL common Table Expressions and Window Functions Revealed

    Walk away from old-fashioned and cumbersome query approaches and answer your business intelligence questions through simple and powerful queries built on common table expressions (CTEs) and window ...

    Regular Expressions Cookbook.pdf

    **"Regular Expressions Cookbook.pdf"** 这个标题明确指出本书的主题是正则表达式(Regular Expressions,简称 Regex)。正则表达式是一种强大的文本处理工具,被广泛应用于搜索、替换以及解析文本等任务中。...

    Regular.Expressions

    正则表达式(Regular Expressions,简称regex)是编程领域中一种强大的文本处理工具,它用于模式匹配、数据提取、验证输入等任务。这个“Regular.Expressions”资料包显然是为开发者设计的,旨在深入理解正则表达式...

    Mastering Regular Expressions 3rd

    文件列表中的"OReilly.Mastering.Regular.Expressions.3rd.Edition.Aug.2006.chm"是一个包含该书籍内容的CHM(Compiled HTML Help)格式文件。CHM文件是微软的一种帮助文档格式,通常用于存放电子书或软件帮助文档,...

    Introducing Regular Expressions pdf

    正则表达式(Regular Expressions)是一种强有力的文本匹配工具,用于在字符串中执行模式匹配和提取信息。从给出的文件内容来看,我们正在讨论一本关于正则表达式的电子书——《Introducing Regular Expressions》,...

    Mastering_Regular_Expressions

    《Mastering Regular Expressions》是一本关于正则表达式技术的专业书籍,由 Jeffrey E. F. Friedl 撰写,O'Reilly 出版社出版。本书旨在帮助读者深入理解并熟练运用正则表达式这一强大的文本处理工具,不仅适用于 ...

    Z.Expressions.Eval.2.4.2

    Z.Expressions.Eval 2.4.2 是一个专注于表达式解析的开源库,它由Java语言构建,设计为超轻量级且高度可扩展。这个工具包的主要目标是提供一个强大的框架,允许开发者在应用程序中方便地处理和执行自定义的公式化...

    Z.Expressions.Eval.rar

    公式操作、表达式动态语句,可以考虑使用 Eval Expression。 本文件给你无限使用的特权,基于netstand2.1制作,可以方便的...需要下列包 ... &lt;PackageReference Include="System.Xml.XPath" Version="4.3.0" /&gt;

    Packt.Java.9.Regular.Expressions

    You will begin by discovering what regular expressions are and how they work with Java. This easy-to-follow guide is a great place from which to familiarize yourself with the core concepts of regular ...

    Expressions-1.3.3.zip expressions: 1.3.3

    带有正则表达式的应用程序。 简约的UI 忘记按钮。只需键入您的模式并测试表达式。立即查看结果。 突出显示语法 不仅看起来不错,而且易于阅读。 参考表 总是忘记正则表达式的语法吗?只需按cmd r并查看参考表...

    Mastering Regular Expressions(3rd Edition)

    《Mastering Regular Expressions》(第三版)是正则表达式领域的权威著作,由拥有近30年开发经验的专家Jeffrey E.F. Friedl撰写。这本书深入浅出地介绍了正则表达式的概念、语法以及实际应用,是编程者提升正则...

    SpeedTest_DelphiXE4 PerlRegEx 和 官方的 RegularExpressions 速度测试

    在IT领域,正则表达式(Regular Expressions)是一种强大的文本处理工具,广泛应用于字符串匹配、搜索、替换等任务。Delphi,作为一个流行的Object Pascal开发环境,提供了多种正则表达式实现供开发者选择。本测试...

    Mastering Regular Expressions.pdf

    #### 标题:Mastering Regular Expressions - **主要内容**:本书深入探讨了正则表达式的高级用法和技术细节,旨在帮助读者掌握正则表达式的各个方面。 #### 描述:Mastering Regular Expressions.pdf - **内容...

    Mastering Regular Expressions(3rd) 无水印pdf

    Mastering Regular Expressions(3rd) 英文无水印pdf 第3版 pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,...

    MariaDB and MySQL Common Table Expressions and Window Functions Revealed epub

    MariaDB and MySQL Common Table Expressions and Window Functions Revealed 英文epub 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除

    Regular Expressions Pocket Primer

    To introduce readers to regular expressions in several technologies. While the material is primarily for people who have little or no experience with regular expressions, there is also some content ...

    Beginning.Regular.Expressions

    本书《Beginning Regular Expressions》由Andrew Watt编写,旨在为读者提供一个系统学习正则表达式的起点。书中详细介绍了正则表达式的语法、特性及其在不同编程环境下的应用。 #### 二、正则表达式概述 ##### 1. ...

Global site tag (gtag.js) - Google Analytics