对于二叉搜索树,我们规定任一结点的左子树仅包含严格小于该结点的键值,而其右子树包含大于或等于该结点的键值。如果我们交换每个节点的左子树和右子树,得到的树叫做镜像二叉搜索树。
现在我们给出一个整数键值序列,请编写程序判断该序列是否为某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,如果是,则输出对应二叉树的后序遍历序列。
输入格式:
输入的第一行包含一个正整数N(≤1000),第二行包含N个整数,为给出的整数键值序列,数字间以空格分隔。
输出格式:
输出的第一行首先给出判断结果,如果输入的序列是某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,则输出YES
,否侧输出NO
。如果判断结果是YES
,下一行输出对应二叉树的后序遍历序列。数字间以空格分隔,但行尾不能有多余的空格。
输入样例1:
7
8 6 5 7 10 8 11
输出样例1:
YES
5 7 6 8 11 10 8
输入样例2:
7
8 6 8 5 10 9 11
输出样例2:
NO
序号 | 输入 | 输出 |
1 | 7 8 6 5 7 10 8 11 | YES 5 7 6 8 11 10 8 |
2 | 7 8 10 11 8 6 7 5 | YES 11 8 10 7 5 6 8 |
3 | 7 8 6 8 5 10 9 11 | NO |
4 | 16 100 70 60 62 68 65 69 200 150 140 160 155 300 400 500 450 | YES 65 69 68 62 60 70 140 155 160 150 450 500 400 300 200 100 |
5 | 17 85 92 100 120 110 105 88 90 50 20 30 40 35 36 32 28 15 | YES 105 110 120 100 90 88 92 36 32 35 40 28 30 15 20 50 85 |
6 | 7 8 6 7 5 10 11 9 | NO |
7 | 1 -1 | YES -1 |
能把补充的样例 输出全部对上基本是对了
这题就是跟 根据先序和中序 建立树的代码差不多 只是少了中序 限定了是搜索树的条件
#include <stdio.h>
#include <stdlib.h>
typedef struct treenode *tree;
struct treenode {
tree left;
tree right;
int item;
};
int flag1 = 0;//flag1是对非镜像搜索树
int flag2 = 0;//flag2是对镜像搜索树
tree findtree(int pre[], int le) {
if (!le) return NULL;
tree node = (tree)malloc(sizeof(struct treenode));
node->item = *pre;
int i, j;
for (i = 1; i < le; i++) {
if (pre[i] >= node->item) break;
}
for (j = i; j < le; j++) {
if (pre[j] < node->item) {
flag1 = 1;
return NULL;
}
}
node->left = findtree(pre + 1, i-1);
node->right = findtree(pre + i, le - i);
return node;
}
tree findmirrortree(int pre[], int le) {
if (!le) return NULL;
tree node = (tree)malloc(sizeof(struct treenode));
node->item = *pre;
int i, j;
for (i = 1; i < le; i++) {
if (pre[i] < node->item) break;
}
for (j = i; j < le; j++) {
if (pre[j] >= node->item) {
flag2 = 1;
return NULL;
}
}
node->left = findmirrortree(pre + 1, i - 1);
node->right = findmirrortree(pre + i, le - i);
return node;
}
int flag = 0;
void bprint(tree t) {
if (t) {
bprint(t->left);
bprint(t->right);
if (!flag) flag = 1;
else printf(" ");
printf("%d", t->item);
}
}
int main()
{
int n,i,pre[1005];
scanf("%d", &n);
for (i = 0; i < n; i++)
scanf("%d", &pre[i]);
tree t,tmr;
t = findtree(pre, n);
tmr = findmirrortree(pre, n);
if (t&&!flag1) {
printf("YES\n");
bprint(t);
printf("\n");
}
else if (tmr&&!flag2) {
printf("YES\n");
bprint(tmr);
printf("\n");
}
else printf("NO\n");
return 0;
}