给定一棵二叉树的中序遍历和前序遍历,求其层序遍历。
本题要求交换左右节点,所以先递归右子树。
其中 index - mid_s 表示的是左子树有多少个节点,fir_s加上它再加一,前序遍历的下标就会从右子树第一个节点开始。
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int mid[35], fir[35], ans[100005];
void dfs (int fir_s, int mid_s, int mid_e, int k)
{
if (mid_s <= mid_e) {
int index = 0;
for (int i = mid_s; i <= mid_e; i++) {
if (mid[i] == fir[fir_s]) {
index = i;
break;
}
}
ans[k] = fir[fir_s];
dfs(fir_s + index - mid_s + 1, index + 1, mid_e, 2 * k); //右子树
dfs(fir_s + 1, mid_s, index - 1, 2 * k + 1); //左子树
}
}
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++) cin >> mid[i];
for (int i = 1; i <= n; i++) cin >> fir[i];
dfs(1, 1, n, 1);
int cnt = 0;
for (int i = 1; i < 100005; i++) {
if (ans[i] != 0){
cout << ans[i];
cnt++;
}
if (cnt < n && ans[i] != 0)
cout << " ";
}
return 0;
}
//记得要return 0;
如果给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。题目链接
mid_e - index 表示的是右子树有多少个节点。
dfs(end_e - (mid_e - index) - 1, mid_s, index - 1, 2 * k); //左子树
dfs(end_e - 1, index + 1, mid_e, 2 * k + 1); //右子树
这样子dfs就好了。
—————————分界线————————
如果给定一棵二叉树的后序遍历和中序遍历,请你输出其前序遍历的序列:洛谷1030
大体上还是相似的,输入上要这样改一改:
cin >> mid >> ed;
int n = ed.length();
mid = " " + mid;
ed = " " + ed;
dfs(n, 1, n);