第一行一个整数 n,表示二叉树的大小。
第二行 n 个整数 a_i,表示二叉树的先序遍历数组。
第三行 n 个整数 b_i,表示二叉树的中序遍历数组。
输出一行 n 个整数表示二叉树的后序遍历数组。
3 1 2 3 2 1 3
2 3 1
数据保证合法
#include <stdio.h> #include <stdlib.h> typedef struct { int val; int l_child, r_child; } TreeNodeInfo, *INFO; TreeNodeInfo infos[10010]; // 全局区 int createTree(int* pre, int* inorder, int i, int j, int n) { // recursion exit condition if (n <= 0) return 0; if (n == 1) return *(pre + i); int k = j; while (*(inorder + k) != *(pre + i)) ++k; int l = k - j; infos[*(pre + i)].l_child = createTree(pre, inorder, i + 1, j, l); infos[*(pre + i)].r_child = createTree(pre, inorder, i + 1 + l, k + 1, n - 1 - l); return *(pre + i); } void postorder(INFO infos, int index) { if (!index) return; postorder(infos, infos[index].l_child); postorder(infos, infos[index].r_child); fprintf(stdout, "%d ", index); } int main(int argc, char* argv[]) { int n; fscanf(stdin, "%d", &n); int i, pre[n], inorder[n]; for (i = 0; i < n; ++i) fscanf(stdin, "%d", pre + i); for (i = 0; i < n; ++i) fscanf(stdin, "%d", inorder + i); createTree(pre, inorder, 0, 0, n); postorder(infos, *pre); return 0; }