7-28 搜索树判断 (25 分)

7-28 搜索树判断 (25 分)

对于二叉搜索树,我们规定任一结点的左子树仅包含严格小于该结点的键值,而其右子树包含大于或等于该结点的键值。如果我们交换每个节点的左子树和右子树,得到的树叫做镜像二叉搜索树。

现在我们给出一个整数键值序列,请编写程序判断该序列是否为某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,如果是,则输出对应二叉树的后序遍历序列。

输入格式:

输入的第一行包含一个正整数$N$(≤1000),第二行包含$N$个整数,为给出的整数键值序列,数字间以空格分隔。

输出格式:

输出的第一行首先给出判断结果,如果输入的序列是某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,则输出YES,否侧输出NO。如果判断结果是YES,下一行输出对应二叉树的后序遍历序列。数字间以空格分隔,但行尾不能有多余的空格。

输入样例1:

1
2
7
8 6 5 7 10 8 11

输出样例1:

1
2
YES
5 7 6 8 11 10 8

输入样例2:

1
2
7
8 6 8 5 10 9 11

输出样例2:

1
NO
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct TNode *tree;
struct TNode
{
int data;
tree lchild;
tree rchild;
};
int flag = 0; //控制最后一个输出后面没有空格
int flag1 ; //如果不是二叉搜索树返回1
int flag2 ; //如果不是二叉镜像搜索树返回1

void Print( tree t);
tree Find ( int pre[],int len);
tree FindMirror( int pre[],int len);

int main()
{
int len;
int pre[1005];
int i;
tree t,tm;

scanf("%d",&len);
for( i=0; i<len; i++)
{
scanf("%d",&pre[i]);
}

t = Find( pre,len);
tm = FindMirror( pre,len );
if( t && !flag1)
{
//树不为空并且是二叉搜索树
printf("YES\n");
Print( t );
printf("\n");
}
else if( tm && !flag2)
{
//树不为空并且是二叉镜像搜索树
printf("YES\n");
Print( tm );
printf("\n");
}
else printf("NO\n");

return 0;
}


tree Find ( int pre[],int len)
{
int i,j;

if( !len ) return NULL;
tree temp = (tree) malloc( sizeof( struct TNode));
temp->data = *pre;

for( i=1; i<len; i++)
{
if( pre[i] >= temp->data)
//寻找右子树
break;
}
for( j=i; j<len; j++)
{
if( pre[j] < temp->data)
{
//右子树中有小于根结点的值,不是二叉搜索树
flag1 = 1;
return NULL;
}
}
temp->lchild = Find( pre+1, i-1);
temp->rchild = Find( pre+i, len-i);
return temp;
}
tree FindMirror( int pre[],int len)
{
//镜像树,左子树大于根大于右子树
int i,j;

if( !len ) return NULL;
tree temp = (tree) malloc( sizeof( struct TNode));
temp->data = *pre;

for( i=1; i<len; i++)
{
if( pre[i] < temp->data)
//寻找右子树
break;
}
for( j=i; j<len; j++)
{
if( pre[j] >= temp->data)
{
//右子树中有大于等于根结点的值,不是二叉搜索树
flag2 = 1;
return NULL;
}
}
temp->lchild = FindMirror( pre+1, i-1);
temp->rchild = FindMirror( pre+i, len-i);
return temp;
}

void Print( tree t)
{

if( t )
{
//后序遍历
Print(t->lchild);
Print(t->rchild);
if( !flag ) flag = 1;
else printf(" ");
printf("%d",t->data);
}
}
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×