搜索树判断
来源:互联网 发布:电气原理图软件 编辑:程序博客网 时间:2024/04/28 13:10
对于二叉搜索树,我们规定任一结点的左子树仅包含严格小于该结点的键值,而其右子树包含大于或等于该结点的键值。如果我们交换每个节点的左子树和右子树,得到的树叫做镜像二叉搜索树。
现在我们给出一个整数键值序列,请编写程序判断该序列是否为某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,如果是,则输出对应二叉树的后序遍历序列。
输入格式:
输入的第一行包含一个正整数N(≤1000),第二行包含N个整数,为给出的整数键值序列,数字间以空格分隔。
输出格式:
输出的第一行首先给出判断结果,如果输入的序列是某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,则输出YES
,否侧输出NO
。如果判断结果是YES
,下一行输出对应二叉树的后序遍历序列。数字间以空格分隔,但行尾不能有多余的空格。
输入样例1:
78 6 5 7 10 8 11
输出样例1:
YES5 7 6 8 11 10 8
输入样例2:
78 6 8 5 10 9 11
输出样例2:
NO
序号输入输出178 6 5 7 10 8 11
YES5 7 6 8 11 10 82
78 10 11 8 6 7 5
YES11 8 10 7 5 6 83
78 6 8 5 10 9 11
NO4
16100 70 60 62 68 65 69 200 150 140 160 155 300 400 500 450
YES65 69 68 62 60 70 140 155 160 150 450 500 400 300 200 1005
1785 92 100 120 110 105 88 90 50 20 30 40 35 36 32 28 15
YES105 110 120 100 90 88 92 36 32 35 40 28 30 15 20 50 856
78 6 7 5 10 11 9
NO7
1-1
YES-1这里多补充几个样例 这类题目不错个2 3 遍你还真不知道还有什么地方可以错
能把补充的样例 输出全部对上基本是对了
这题就是跟 根据先序和中序 建立树的代码差不多 只是少了中序 限定了是搜索树的条件
#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;}
0 0
- c++搜索树判断
- pta---搜索树判断
- PAT判断搜索树
- 搜索树判断
- 搜索树判断
- pat 搜索树判断
- PAT4-06. 搜索树判断
- 4-06. 搜索树判断
- 5-28 搜索树判断
- 5-28 搜索树判断
- 二叉搜索树判断子树相等
- pat4-06 Data_sturcture 搜索树判断
- 判断一颗树是否为二叉搜索树
- 二叉搜索树的后序判断
- 判断二叉搜索树的合法性
- 判断一棵树是否是二叉搜索树
- 5-28 搜索树判断 (25分)
- 判断一棵树是不是二叉搜索树
- BZOJ 1624: [Usaco2008 Open] Clear And Present Danger 寻宝之路
- 骨牌覆盖去除切割线的情况(DP+容斥原理)
- UVALive 7270 Osu! Master 水题
- File类的使用1
- javaweb
- 搜索树判断
- 三人行之C从零开始
- Objective C转Swift注意事项(二)值类型和协议
- 百度地图sdk的导入
- BestCoder Round #84
- [LEETCODE] 287. Find the Duplicate Number
- javaweb
- Spring Transaction 源码
- LeetCode 9. Palindrome Number