1127. ZigZagging on a Tree (30) 後序中序建樹 + 反向輸出層次遍歷

傳送門

題意:

給出一個樹的中序和後序遍歷結果,求它的Z字型層序遍歷,也就是偶數層從右往左,奇數層從左往右遍歷~


思路:

這是我那次pat考試的題目當時做出來了有點忘記了今天在回顧一下吧.

具體做法見這裏

#include<bits/stdc++.h>

using namespace std;
const int maxn = 35;
int in[maxn],post[maxn],n;
struct node
{
    int val;
    node *l;
    node *r;
    node()
    {
        l = r = nullptr;
    }
};
int cur;
int find_root(int val)
{
    for(int i = 1;i <= n;++i)
    {
        if(in[i] == val)
            return i;
    }
    return -1;
}
node* createTree(node *root,int left,int right)
{
    if(left > right) return nullptr;
    int val = post[cur--];
    int pos = find_root(val);
    node *tmp = new node;
    tmp -> val = val;
    tmp -> r = createTree(tmp -> r,pos + 1,right);
    tmp -> l = createTree(tmp -> l,left,pos - 1);
    return tmp;
}
void zigzag(node *root)
{
    int ans[maxn],mid[maxn],ans_num = 0,mid_num = 0;
    queue<node *>Q;
    while(!Q.empty()) Q.pop();
    Q.push(nullptr);
    Q.push(root);
    int flag = 0;

    while(!Q.empty())
    {
        node *p = Q.front();Q.pop();
        //if(p == root)
           // cout << ans_num << endl;
        if(p == nullptr)
        {
            if(!Q.empty()) Q.push(nullptr);
            if(!flag)
            {
               // puts("**");
                for(int i = 0;i < mid_num;++i)
                    ans[ans_num++] = mid[i];
                mid_num = 0;
            }
            else
            {
                for(int i = mid_num - 1;i >= 0;--i)
                    ans[ans_num++] = mid[i];
                mid_num = 0;
            }
            flag = 1 - flag;
        }
        else
        {
            mid[mid_num++] = p -> val;
            if(p -> l != nullptr)
                Q.push(p -> l);
            if(p -> r != nullptr)
                Q.push(p -> r);

        }
    }
    for(int i = 0;i < ans_num;++i)
    {
        printf("%d%c",ans[i],i == ans_num - 1?'\n':' ');
    }
    return ;
}
int main()
{
    while(~scanf("%d",&n))
    {
        for(int i = 1;i <= n;++i)
            scanf("%d",&in[i]);
        for(int i = 1;i <= n;++i)
            scanf("%d",&post[i]);
        node *root = nullptr;
        cur = n;
        root = createTree(root,1,n);
        zigzag(root);
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章