#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
/*
1、扫描所给序列进数组test
2、用test数组分别构建升序树root1,和降序树root2
3、先序遍历root1,如果和test顺序一样,输出YES,和root1的后序遍历
4、root2步骤同3
5、如果root1的先序和root2的先序与test数组都不一致,输出NO
*/
typedef struct node{
int data;
struct node *lchild;
struct node *rchild;
}node;
node *root1;
node *root2;
int n;
int i,j;
int test[1000];
int flag=0,first=1;
//Ascend
void Ascend_tree(node *p,int k){
if(k >= p->data){
if(p->rchild == NULL){
node *q;
q=malloc(sizeof(node));
q->data=k;
q->lchild=NULL;
q->rchild=NULL;
p->rchild=q;
//printf("add %d to %d right\n",k,p->data);
}
else{
Ascend_tree(p->rchild, k);
}
}
if(k < p->data){
if(p->lchild == NULL){
node *q;
q=malloc(sizeof(node));
q->data=k;
q->lchild=NULL;
q->rchild=NULL;
p->lchild=q;
//printf("add %d to %d left\n",k,p->data);
}
else{
Ascend_tree(p->lchild, k);
}
}
}
//Descend
void Descend_tree(node *p,int k){
if(k < p->data){
if(p->rchild == NULL){
node *q;
q=malloc(sizeof(node));
q->data=k;
q->lchild=NULL;
q->rchild=NULL;
p->rchild=q;
//printf("add %d to %d right\n",k,p->data);
}
else{
Descend_tree(p->rchild, k);
}
}
if(k >= p->data){
if(p->lchild == NULL){
node *q;
q=malloc(sizeof(node));
q->data=k;
q->lchild=NULL;
q->rchild=NULL;
p->lchild=q;
//printf("add %d to %d left\n",k,p->data);
}
else{
Descend_tree(p->lchild, k);
}
}
}
void Pre_tra(node *p){
//printf("p->data = %d\n",p->data);
if(test[j++] != p->data){flag=1;return;}
else{
if(p->lchild != NULL) Pre_tra(p->lchild);
if(p->rchild != NULL) Pre_tra(p->rchild);
}
}
void Post_order_tra(node *p){
if(p->lchild != NULL) Post_order_tra(p->lchild);
if(p->rchild != NULL) Post_order_tra(p->rchild);
if(first == 0) printf(" %d",p->data);
if(first == 1){printf("%d",p->data);first=0;}
}
int main()
{
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&test[i]);
}
root1 = malloc(sizeof(node));
root2 = malloc(sizeof(node));
root1->data = test[0];
root1->lchild = NULL;
root1->rchild = NULL;
root2->data = test[0];
root2->lchild = NULL;
root2->rchild = NULL;
for(i=1;i<n;i++){
Ascend_tree(root1,test[i]);
}
for(i=1;i<n;i++){
Descend_tree(root2,test[i]);
}
j=0;
Pre_tra(root1);
if(flag==0){
printf("YES\n");
//打印后序遍历
first=1;
Post_order_tra(root1);
}
else{
j=0;
flag=0;
Pre_tra(root2);
if(flag==0){
printf("YES\n");
//打印后序遍历
first=1;
Post_order_tra(root2);
}
}
if(flag==1) printf("NO");
return 0;
}
pat甲级1043c语言
最新推荐文章于 2025-12-18 16:44:05 发布
该程序创建两个二叉树,一个升序(Ascend_tree),一个降序(Descend_tree),基于输入的整数序列。通过先序遍历检查这两个二叉树是否能匹配原始序列。如果匹配,则输出YES及后序遍历结果;如果不匹配,则输出NO。
563

被折叠的 条评论
为什么被折叠?



