原题链接
L2-011 玩转二叉树
解题思路
利用前序遍历和中序遍历的特点进行深搜 深搜退出条件:中序首>=尾不成立 深搜递归:改变根节点,中序首尾指向,存放下标 要点:由前序找到中序的根
ac代码
#include <iostream>
#include <cstring>
using namespace std;
int in[30], pre[30];
int level[100000];
void dfs(int root, int start, int end, int index) {
if(start > end) return;
level[index] = pre[root];
int i = start;
while(i < end && in[i] != pre[root]) i++;
dfs(root + 1, start, i - 1, 2 * index + 2);
dfs(root + (i - start) + 1, i + 1, end, 2 * index + 1);
}
int main() {
memset(level, -1, sizeof(level));
int n;
scanf("%d",&n);
for(int i = 0; i < n; i++) scanf("%d", &in[i]);
for(int i = 0; i < n; i++) scanf("%d", &pre[i]);
dfs(0, 0, n - 1, 0);
int cnt = 0;
for(int i = 0; i < 10000; i++) {
if(level[i] != -1) {
if(cnt != n - 1) {
printf("%d ", level[i]);
cnt++;
} else{
printf("%d", level[i]);
break;
}
}
}
return 0;
}
|