中序和后序确定层序
题意:
给出中序和后序遍历 输出层序遍历
思路:
后序可以确定根节点
中序根节点前面的数是根节点左儿子的子集 而根节点右边的数是其右儿子的子集
递归确定每棵子树的根节点
记录父子关系 然后遍历二叉树存图输出
#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(); } }