PAT (Advanced Level)1020 Tree Traversals (25) 树的遍历

题目链接

1020 Tree Traversals (25)


题意

  • 前序遍历:Preorder Traversal
  • 中序遍历:Inorder Traversal
  • 后序遍历:PostorderTraversal
  • 层次遍历:level order traversal

已知中序和后序,求层次遍历

解题思路

由中序和后序来建树,因为中序的最后一个必定是根节点,只要再该根节点左右继续构建左子树和右子树就行了,构建完以后BFS得到层次遍历

Code

#include <bits/stdc++.h>

using namespace std;

struct Node
{
    int val;
    int left, right;
};
const int maxn = 35;
int post[maxn], //后序(左右根)
    in[maxn];   //中序(左根右)
Node tree[maxn];
int cnt = 0;
int n;

int build(int l,int r,int ll,int rr)
{
    int index = ++cnt;
    tree[index].val = post[rr];
    tree[index].left = tree[index].right = -1;
    int pos = l;
    while(in[pos]!=post[rr])
        pos++;
    if(l<=pos-1)
        tree[index].left = build(l, pos - 1, ll, ll + pos - 1 - l);
    if(pos+1<=r)
        tree[index].right = build(pos + 1, r, rr - r + pos, rr - 1);
    //cout << tree[index].val<<' ' << tree[index].left<<' '<<tree[index].right << endl;
    return index;
}

void bfs()
{
    queue<Node> Q;
    vector<int> ans;
    Q.push(tree[1]);
    while(!Q.empty())
    {
        Node u = Q.front();
        Q.pop();
        //cout << u.val<<endl;
        ans.push_back(u.val);
        if(u.left>0)
            Q.push(tree[u.left]);
        if(u.right>0)
            Q.push(tree[u.right]);
    }
    for (size_t i = 0; i < ans.size();i++)
    {
        if(i==0)
            cout << ans[i];
        else
            cout << ' ' << ans[i];
    }
    cout << endl;
}

int main(int argc, char const *argv[])
{
    //freopen("input.txt", "r", stdin);
    cin >> n;
    for(size_t i = 1; i <= n; i++)
        cin >> post[i];
    for (size_t i = 1; i <= n;i++)
        cin >> in[i];
    build(1, n, 1, n);
    bfs();
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值