中序和后序确定层序

L2-006 树的遍历 (25 分)

题意:

给出中序和后序遍历 输出层序遍历

思路:

后序可以确定根节点

中序根节点前面的数是根节点左儿子的子集 而根节点右边的数是其右儿子的子集

递归确定每棵子树的根节点

记录父子关系 然后遍历二叉树存图输出

复制代码
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define ll long long
ll n;
ll zx[50], hx[50], ans[50];
struct node {
    ll l, r;
}fa[50];
// zxl zxr hxl hxr 分别代表中序遍历和后序遍历的左右区间 ll find(ll zxl, ll zxr, ll hxl, ll hxr) {
//当中序左边界大于有边界时说明不能继续下去了 不能等于应为当等于时可能左右儿子中有一个儿子不存在
if (zxl > zxr) return 0;
//记录根 ll root
= hx[hxr]; ll p1 = zxl;
//记录根的位子
while (zx[p1] != root) { p1++; }
//p2代表左子树节点的个数 中序遍历的左子树元素集等于后序遍历区段前p2个元素 ll p2
= p1 - zxl; fa[root].l = find(zxl, p1 - 1, hxl, hxl + p2 - 1); fa[root].r = find(p1 + 1, zxr, hxl + p2, hxr - 1); return root; } void solve() { cin >> n; for (int i = 1; i <= n; i++) { cin >> hx[i]; } for (int i = 1; i <= n; i++) { cin >> zx[i]; } ll x = find(1, n, 1, n);
//存层序遍历的图 queue
<ll>q; ll tot = 0; q.push(hx[n]); while (!q.empty()) { ll now = q.front(); q.pop(); ans[++tot] = now; if(fa[now].l) q.push(fa[now].l); if(fa[now].r) q.push(fa[now].r); }
//输出
for (int i = 1; i <= tot; i++) { cout << ans[i] << " \n"[i == tot]; } } signed main() { IOS; int t = 1; //cin >> t; while (t--) { solve(); } }
复制代码

 

posted @   Yaqu  阅读(58)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示