PAT_甲級_1130 Infix Expression

題目大意

給定一顆抽象語法二叉樹,要求輸出其中序遍歷序列node

算法思路

使用靜態數組nodes存儲每個結點的信息,使用father數組記錄全部結點的父親結點,這樣在遍歷father的時候其值爲0的就是根結點下標root。對於其中序遍歷的輸出,其特色是對於根結點沒有左右括號,除此以外只要有孩子存在就必定有左右括號,單目運算必定在左邊,而後就是雙目運算和數字。ios

提交結果

圖片.png

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;
}
相關文章
相關標籤/搜索