您的位置:首页 > 其它

团体程序设计天梯赛-练习集 L2-004. 这是二叉搜索树吗? 解题报告

2017-03-15 08:09 274 查看


L2-004. 这是二叉搜索树吗?

时间限制

400 ms

内存限制

65536 kB

代码长度限制

8000 B

判题程序

Standard

作者

陈越

一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点,

其左子树中所有结点的键值小于该结点的键值;

其右子树中所有结点的键值大于等于该结点的键值;

其左右子树都是二叉搜索树。

所谓二叉搜索树的“镜像”,即将所有结点的左右子树对换位置后所得到的树。

给定一个整数键值序列,现请你编写程序,判断这是否是对一棵二叉搜索树或其镜像进行前序遍历的结果。

输入格式:

输入的第一行给出正整数N(<=1000)。随后一行给出N个整数键值,其间以空格分隔。

输出格式:

如果输入序列是对一棵二叉搜索树或其镜像进行前序遍历的结果,则首先在一行中输出“YES”,然后在下一行输出该树后序遍历的结果。数字间有1个空格,一行的首尾不得有多余空格。若答案是否,则输出“NO”。
输入样例1:
7
8 6 5 7 10 8 11

输出样例1:
YES
5 7 6 8 11 10 8

输入样例2:
7
8 10 11 8 6 7 5

输出样例2:
YES
11 8 10 7 5 6 8

输入样例3:
7
8 6 8 5 10 9 11

输出样例3:
NO


代码:

#include <cstdio>
#include <iostream>
#include <queue>
using namespace std;

struct node
{
int v;
node* left;
node* right;
node(int v):v(v),left(NULL),right(NULL){}
};

int k = 0, flag1 = 0, flag2 = 0, pflag = 0, n, a[1010];;

void build(node* &root, int v)
{
if(root == NULL)
{
root = new node(v);
return;
}
if(v < root->v) build(root->left, v);
else build(root->right, v);
}

void preOrder(node* rt)
{
if(a[k++] != rt->v) flag1 = 1;
if(flag1) return;
if(rt->left) preOrder(rt->left);
if(rt->right) preOrder(rt->right);
}

void preOrder2(node* rt)
{
if(a[k++] != rt->v) flag2 = 1;
if(flag2) return;
if(rt->right) preOrder2(rt->right);
if(rt->left) preOrder2(rt->left);
}

void print(node* rt)
{
if(rt->left) print(rt->left);
if(rt->right) print(rt->right);
if(!pflag) {printf("%d", rt->v);pflag = 1;}
else printf(" %d", rt->v);
}

void print2(node* rt)
{
if(rt->right) print2(rt->right);
if(rt->left) print2(rt->left);
if(!pflag) {printf("%d", rt->v);pflag = 1;}
else printf(" %d", rt->v);
}

int main()
{
node *root = NULL;
scanf("%d", &n);
for(int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
build(root, a[i]);
}
preOrder(root);
k = 0;
preOrder2(root);
if(!flag1 || !flag2)
{
printf("YES\n");
if(!flag1) print(root);
else print2(root);
printf("\n");
}
else printf("NO\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  pat 二叉树 天梯赛
相关文章推荐