迷失の搜索树
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
小璐在机缘巧合之下获得了一个二叉搜索树,这个二叉搜索树恰好有n个节点,每个节点有一个权值,每个节点的权值都在[1,n]这个区间内,并且两两不相同,真是优美的性质啊
但是命运的不公又让她失去了这个二叉搜索树
幸运的是,她还记得自己丢失的二叉搜索树的前序遍历序列。
在丢了二叉搜索树之后,小璐无比想念她的这个树的后序遍历
那么问题来了,聪明的你在知道这个二叉搜索树的前序遍历的序列的情况下,能帮她找到这个二叉搜索树的后序遍历嘛?
Input
多组输入,以文件结尾
每组数据第一行为一个整数n,代表这个二叉搜索树的节点个数(1<=n<=100)
接下来一行n个整数,代表这个二叉搜索树的前序遍历序列
Output
输出n个整数
表示这个二叉树的后序遍历序列
Sample Input
5
4 2 1 3 5
Sample Output
1 3 2 5 4
Hint
二叉查找树是一棵空树,或者是具有下列性质的二叉树:
若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值
若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值
它的左、右子树也分别为二叉排序树
Source
2016暑假集训结训赛 by QAQ
思路:这个感觉是最简单的,,套模建立二叉排序树,直接对其使用后续遍历,输出即可;
#include <stdio.h> #include <stdlib.h> #include <string.h> int k, a[1001]; struct node { int data; struct node *lc; struct node *rc; }; struct node *creat(struct node *root, int x) { if(root == NULL) { root = (struct node *)malloc(sizeof(struct node)); root->lc = NULL; root->rc = NULL; root->data = x; } else { if(x > root->data) { root->rc = creat(root->rc, x); } else { root->lc = creat(root->lc, x); } } return root; }; void houxu(struct node *root) { if(root != 0) { houxu(root->lc); houxu(root->rc); a[k++] = root->data; } } int main() { int n, i, x; struct node *root; while(scanf("%d", &n) != EOF) { root = NULL; k = 0; for(i = 1; i <= n; i++) { scanf("%d", &x); root = creat(root, x); } houxu(root); for(i = 0; i < k; i++) { if(i == k - 1) { printf("%d\n", a[i]); } else { printf("%d ", a[i]); } } } return 0; }