发现构建树的方法真的有很多种,这又是一种思路,因为题目按照层次遍历的顺序给出了每个节点的左孩子右孩子,-1代表不存在
采取的是这种方法
中序序列是已经的,就按照中序遍历递归地赋予每个结构体数据,再层次BFS输出
struct BTnode {
int data;
int lchild, rchild;
}node[maxn];
void inOrder(int root) {
if (root == -1) return;
inOrder(node[root].lchild);
node[root].data = in[num++];
inOrder(node[root].rchild);
}
AC代码
#include <cstdio>
#include <iostream>
#include <string>
#include <map>
#include <set>
#include <cstring>
#include <vector>
#include <sstream>
#include <queue>
#include <algorithm>
#include <cmath>
#include <ctype.h>
using namespace std;
const int maxn = 110;
int n, in[maxn], num = 0;
struct BTnode {
int data;
int lchild, rchild;
}node[maxn];
void inOrder(int root) {
if (root == -1) return;
inOrder(node[root].lchild);
node[root].data = in[num++];
inOrder(node[root].rchild);
}
void BFS(int root) {
queue<int> q;
q.push(root);
num = 0;
while (!q.empty()) {
int now = q.front();
q.pop();
printf("%d", node[now].data);
if (++num < n) printf(" ");
if (node[now].lchild != -1) q.push(node[now].lchild);
if (node[now].rchild != -1) q.push(node[now].rchild);
}
}
int main() {
scanf("%d", &n);
int lchild, rchild;
for (int i = 0; i < n; i++) {
scanf("%d%d", &lchild, &rchild);
node[i].lchild = lchild;
node[i].rchild = rchild;
}
for (int i = 0; i < n; i++) {
scanf("%d", &in[i]);
}
sort(in, in + n);
inOrder(0);
BFS(0);
return 0;
}