1

题目大意

给定一颗二叉树的中序和后序序列,要求按照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;
}

乔梓鑫
569 声望17 粉丝

主要分享个人学习经验和心得