关于c++:PAT甲级1130-Infix-Expression

32次阅读

共计 907 个字符,预计需要花费 3 分钟才能阅读完成。

题目粗心

给定一颗形象语法二叉树,要求输入其中序遍历序列

算法思路

应用动态数组 nodes 存储每一个结点的信息,应用 father 数组记录所有结点的父亲结点,这样在遍历 father 的时候其值为 0 的就是根结点下标 root。对于其中序遍历的输入,其特点是对于根结点没有左右括号,除此之外只有有孩子存在就肯定有左右括号,单目运算肯定在右边,而后就是双目运算和数字。

提交后果

AC 代码

#include <cstdio>
#include <algorithm>
#include <string>
#include <iostream>
#include <cstring>

using namespace std;

struct Node{
    string data;
    int left{};
    int right{};}nodes[25];
int root = 0;

void inOrder(int r){if(r==-1){return;}
    if(r!=root&&(nodes[r].left!=-1||nodes[r].right!=-1)){
        // 根节点没有左右括号, 只有有孩子,就有左括号
        printf("(");
    }
    inOrder(nodes[r].left);
    cout<<nodes[r].data;
    inOrder(nodes[r].right);
    if(r!=root&&(nodes[r].left!=-1||nodes[r].right!=-1)){
        // 根节点没有左右括号, 只有有孩子,就有右括号
        printf(")");
    }
}

int main() {
    int n;
    scanf("%d",&n);
    int father[n+1];
    memset(father,0,sizeof(father));
    for(int i=1;i<=n;++i){cin>>nodes[i].data>>nodes[i].left>>nodes[i].right;
        father[nodes[i].left] = i;
        father[nodes[i].right] = i;
    }

    for(int i=1;i<=n;++i){if(father[i]==0){
            root = i;
            break;
        }
    }
    inOrder(root);
    return 0;
}

正文完
 0