0%

PTA笔记-L2

一些关于树的部分的一些题目。

L2-004 这是二叉搜索树吗? (25 分)

描述:

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

  • 其左子树中所有结点的键值小于该结点的键值;
  • 其右子树中所有结点的键值大于等于该结点的键值;
  • 其左右子树都是二叉搜索树。

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

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

输入格式:

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

输出格式:

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

输入样例 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 10 11 8 6 7 5

输出样例 2:

1
2
YES
11 8 10 7 5 6 8

输入样例 3:

1
2
7
8 6 8 5 10 9 11

输出样例 3:

1
NO

Code:

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
124
125
126
127
128
129
130
#include<bits/stdc++.h>
using namespace std;

int input[10000],output[10000];
int count1=0;
int Tree1(int left,int right)//二叉搜索树
{
if(left > right )
return 1;
int root = input[left];
int i=left+1;
// while(input[i++]<root)
// {
// ;
// }
for(;input[i]<root&&i<=right ;)
{
i++;
}
//printf("%d",i);
//printf("1/");
//循环找出那个二叉搜索树右边的开头。
// left ~ i-1 i ~ right-1
//开始判断右子树有没有问题
for(int j=i ; j <=right ;j++)
{
if(input[j]<root)
return 0;
}

if(Tree1(left+1,i-1)==0)
return 0;
if(Tree1(i,right)==0)
return 0;
output[count1++] = root;
return 1;
}

int Tree2(int left,int right)
{
if(left > right )
return 1;
int root = input[left];
int i=left+1;
// while(input[i++]>=root)
// {
// ;
// }
for(;input[i]>=root&&i<=right;)
{
i++;
}
// left ~ i-1 i ~ n-1
for(int j=i;j<right;j++)
{
if(input[j]>=root)
{
return 0;
}
}

if(Tree2(left+1,i-1)==0)
return 0;
if(Tree2(i,right)==0)
return 0;

output[count1++] = root;

return 1;
}

int main()
{
int n=0;
scanf("%d",&n);

//int input[n]={0};

for(int i=0;i<n;i++)
{
scanf("%d",&input[i]);
//printf("%d",input[i]);
}
if(n==1)
{
printf("YES\n%d\n", input[0]);
return 0;
}
if(input[0]>input[1])//这说明是二叉搜索树
{
//printf("6");
//int x = Tree1(0,n-1);
//printf("\n%d\n",x);
if(Tree1(0,n-1)==0)
{
printf("NO\n");
}
else
{
printf("YES\n");
for(int i=0;i<n-1;i++)
{
printf("%d ",output[i]);
}
printf("%d",output[n-1]);

}
}
else //镜像
{
//int x = Tree2(0,n-1);
//printf("%d",x);
if(Tree2(0,n-1) == 0)
{
printf("NO\n");
}
else
{
printf("YES\n");
for(int i=0;i<n-1;i++)
{
printf("%d ",output[i]);
}
printf("%d",output[n-1]);

}
}

return 0;
}

L2-006 树的遍历 (25 分)

描述:

给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。

输入格式:

输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。

输出格式:

在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。

输入样例:

1
2
3
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7

输出样例:

1
4 1 6 3 5 7 2

code:

失败代码:

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
刚开始的代码,先记录一下。

#include<bits/stdc++.h>
using namespace std;

int input1[40],input2[40];
int output[40];
int countN = 0 ;

int createT(int left1 ,int right1 , int left2 ,int right2)
{
if(left1>right1)
{
return -1;
}
int root =input1[right1];
int i=0,j=0;
int tmp=0;
for(i=left2;i<=right2;i++,tmp++)
{
if(input2[i]==root)
{
tmp=i;
//printf("%d ",i);
break;
}
}
printf("%d ",tmp);
//int increace = tmp -left2; //少一个2-0
int increace =tmp;
output[countN++] = root;

output[countN++] = createT(left1,left1+increace-1,left2,tmp-1);
output[countN++] = createT(left1+increace,right1,tmp+1,right2);
// printf("%d ",root);
// if(tmp!=left2)
// {
// output[countN++] = createT(left1,left1+increace-1,left2,tmp-1);
// //printf("zuo %d %d %d %d temp =%d \n",left1,left1+increace,left2,tmp-1);
// } // 1 0 1 -1
// if(createT(left,tmp-1)==0)
// return 0;
// if(tmp!=right2)
// {
// output[countN++] =createT(left1+increace,right1,tmp+1,right2);
// //printf("you\n");
// }
// if(createT(tmp+1,right)==0)
// return 0;
return root;
}


int main()
{
int n=0;
scanf("%d",&n);
//printf("%d\n",n);

for(int i=0;i<n;i++)
{
scanf("%d",&input1[i]);
}
// for(int i=0;i<n;i++)
// {
// printf("%d ",input1[i]);
// }

for(int i=0;i<n;i++)
{
scanf("%d",&input2[i]);
}
// for(int i=0;i<n;i++)
// {
// printf("%d ",input2[i]);
// }

if(createT(0,n-1,0,n-1)==0)
printf("No");
else
printf("Yes");

for(int i=0;i<n - 1;i++)
{
printf("%d ",output[i] );
}
printf("%d",output[n-1]);

return 0;
}

代码:

1
2


结束符

-------- 春花秋月 夏荷冬雪 --------