先递归恢复树的形状,然后对数列排序,中序遍历树,按顺序把关键字插入树中。最后层序遍历整棵树。
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <cstdlib>
#include <queue>
#include <algorithm>
using namespace std;
struct node {
int key, left, right;
};
struct treenode {
node n;
treenode *left, *right;
};
treenode *recovery(node arr[], int index);
void inorder(treenode *root, int arr[]);
void levelorder(treenode *root);
int main(void)
{
int arr1[200], n, i;
node arr2[200];
treenode *root;
scanf("%d", &n);
for (i = 0; i < n; i++) {
scanf("%d %d", &arr2[i].left, &arr2[i].right);
}
for (i = 0; i < n; i++) {
scanf("%d", arr1 + i);
}
sort(arr1, arr1 + n);
root = recovery(arr2, 0);
inorder(root, arr1);
levelorder(root);
return 0;
}
treenode *recovery(node arr[], int index)
{
if (index != -1) {
treenode *tmp = (treenode *)malloc(sizeof(treenode));
tmp->n = arr[index];
tmp->left = recovery(arr, arr[index].left);
tmp->right = recovery(arr, arr[index].right);
return tmp;
}
else
return nullptr;
}
void inorder(treenode *root, int arr[]) {
static int cnt = 0;
if (root) {
inorder(root->left, arr);
root->n.key = arr[cnt];
cnt++;
inorder(root->right, arr);
}
return;
}
void levelorder(treenode *root) {
queue<treenode *> q;
int cnt = 0;
treenode *tmp;
q.push(root);
while (!q.empty()) {
tmp = q.front();
q.pop();
if (tmp->left) {
q.push(tmp->left);
}
if (tmp->right) {
q.push(tmp->right);
}
if (q.empty()) {
printf("%d\n", tmp->n.key);
}
else {
printf("%d ", tmp->n.key);
}
}
return;
}