PAT_甲級_1127 ZigZagging on a Tree

題目大意

給定一顆二叉樹的中序和後序序列,要求按照zigzagging的方式輸出該二叉樹的層序遍歷算法

算法思路

首先根據中序和後序遍歷序列創建該二叉樹,而後在層序遍歷中使用level記錄當前所在層次,每一次將當前層的全部結點都出隊到temp數組中,更新子節點的level併入隊,若是level是奇數就逆序temp,而後添加到ans數組中保存最終的層序遍歷結果,++level。最後輸出ans數組中的結果便可。數組

提交結果

image.png

AC代碼

#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>

using namespace std;

// 中序,後序和中序序列在in數組中的下標
int in[40],post[40],inIndex[40];
int n;// 頂點數目
vector<int> ans;// zigzagging層序遍歷序列

struct Node{
    int v{};
    int level{};
    Node* left = nullptr;
    Node* right = nullptr;
};

Node* createTree(int postL,int postR,int inL){
    if(postL>postR){
        return nullptr;
    }
    Node* root = new Node;
    root->v = post[postR];
    // 獲取根節點在中序遍歷中的位置
    int rootIndex = inIndex[root->v];
    // 左子樹長度
    int leftSize = rootIndex-inL;
    root->left = createTree(postL,postL+leftSize-1,inL);
    root->right = createTree(postL+leftSize,postR-1,rootIndex+1);
    return root;
}

// level爲偶數從左往右,爲奇數從右往左
void layerOrder(Node* root){
    queue<Node*> que;
    root->level = 1;
    que.push(root);
    int level = 1;
    while (!que.empty()){
        int len = que.size();
        vector<int> temp;
        // 一次性遍歷每一層的結點,並保存在temp中
        for(int i=0;i<len;++i){
            Node* t = que.front();
            que.pop();
            if(t->left){
                t->left->level = t->level + 1;
                que.push(t->left);
            }
            if(t->right){
                t->right->level = t->level + 1;
                que.push(t->right);
            }
            temp.push_back(t->v);
        }
        // 層次爲奇數得逆序
        if(level%2!=0){
            reverse(temp.begin(),temp.end());
        }
        for(auto v:temp){
            ans.push_back(v);
        }
        ++level;
    }
}

int main() {
    scanf("%d",&n);
    for(int i=0;i<n;++i){
        scanf("%d",&in[i]);
        inIndex[in[i]] = i;
    }
    for (int i = 0; i < n; ++i) {
        scanf("%d",&post[i]);
    }
    Node* root = createTree(0,n-1,0);
    layerOrder(root);
    for(int i=0;i<ans.size();++i){
        printf("%d",ans[i]);
        if(i<ans.size()-1){
            printf(" ");
        }
    }
    return 0;
}
相關文章
相關標籤/搜索