【PAT甲级】1127 ZigZagging on a Tree(Z字形遍历二叉树)

该博客主要介绍了如何在已有的二叉树层序遍历代码基础上,修改BFS函数实现Z字形遍历。通过设置标志位flag,每遍历完一层就翻转次序,从而达到从右到左再到右的交替遍历效果。代码中使用了unordered_map存储左右子节点,并通过buildTree和bfs函数实现了树的构造和Z字形遍历。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

此题是PAT甲级1020题的拓展,与1020唯一的不同就是输出的不再是层序遍历,而是Z字形遍历,依题意为右->左->右…的次序,在1020的基础上更改BFS函数,设置一个flag实现每隔一层翻转一次原本正常的层序遍历即可得到Z字形遍历。
1020题代码点此跳转

#include <bits/stdc++.h>

using namespace std;

const int N = 40;
int n;
int in[N], post[N];
unordered_map<int, int> l, r, pos;
vector<int> ans;

int buildTree(int il, int ir, int pl, int pr)
{
    int root = post[pr];
    int k = pos[root];
    if(k > il) l[root] = buildTree(il, k - 1, pl, k - 1 - il + pl);
    if(k < ir) r[root] = buildTree(k + 1, ir, k - il + pl, pr - 1);

    return root;
}

void bfs(int u)
{
    queue<int> q;
    q.push(u);
    bool flag = true;
    while(q.size())
    {
        int qSize = q.size();
        for(int i = 0; i < qSize; i++)
        {
            auto t = q.front();
            q.pop();
            ans.push_back(t);
            if(l.count(t)) q.push(l[t]);
            if(r.count(t)) q.push(r[t]);
        }
        if(flag) reverse(ans.begin() + ans.size() - qSize, ans.end());
        flag = !flag;
    }
}

int main()
{
    cin >> n;
    for(int i = 0; i < n; i++)
    {
        cin >> in[i];
        pos[in[i]] = i;
    }
    for(int i = 0; i < n; i++) cin >> post[i];
    int root = buildTree(0, n - 1, 0, n - 1);
    bfs(root);
    cout << ans[0];
    for(int i = 1; i < ans.size(); i++) cout << ' ' << ans[i];
    cout << endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值