L2-006 树的遍历
先建树,再BFS
#include <bits/stdc++.h>
using namespace std;
vector<int> tree[35];
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin >> n;
vector<int> postorder(n);
vector<int> inorder(n);
map<int, int> posorderId;
map<int, int> inorderId;
for (int i = 0; i < n; i++) {
cin >> postorder[i];
posorderId[postorder[i]] = i;
}
for (int i = 0; i < n; i++) {
cin >> inorder[i];
inorderId[inorder[i]] = i;
}
function<void(int, int, int)> build = [&](int l, int r, int mid) {
if (l > r) return;
//找左子树的根
int lroot = -1;
for (int i = l; i <= mid - 1; i++) {
int u = inorder[i];
if (lroot == -1 || posorderId[u] > posorderId[lroot]) {
lroot = u;
}
}
//找右子树的根
int rroot = -1;
for (int i = mid + 1; i <= r; i++) {
int u = inorder[i];
if (rroot == -1 || posorderId[u] > posorderId[rroot]) {
rroot = u;
}
}
tree[inorder[mid]].push_back(lroot), tree[inorder[mid]].push_back(rroot);
if (lroot != -1) build(l, mid - 1, inorderId[lroot]);
if (rroot != -1)build(mid + 1, r, inorderId[rroot]);
};
build(0, n - 1, inorderId[postorder.back()]);
vector<int> leTravel;
function<void (int)> levelTravel = [&](int u) {
queue<int> q;
q.push(u);
leTravel.push_back(u);
while (q.size()) {
int t = q.front(); q.pop();
for (auto &itr : tree[t]) {
if (itr == -1) continue;
leTravel.push_back(itr);
q.push(itr);
}
}
};
levelTravel(postorder.back());
for (int i = 0; i < leTravel.size(); i++) {
cout << leTravel[i] << " "[i == leTravel.size() - 1];
}
return 0;
}
//4.16
//4.8
//
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
2020-03-15 (Good topic)二分法:x的平方根