XDOJ 329 相同排列二叉树

题目: 相同二叉排序树

问题描述

判断两序列是否为同一二叉排序树序列。

输入格式

数据有多组。每组数据第一行是一个数n,(1<=n<=20) 表示有n个需要判断,n=0 的时候输入结束。接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可、以构造出一颗二叉排序树。接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉排序树。

输出格式

如果二叉排序树相同则输出YES,否则输出NO

样例输入

2

567432

543267

576342

0

样例输出

YES

NO

样例说明

思路:对每个序列构建一颗二叉排序树~

我们知道通过前序遍历和中序遍历能确定唯一一颗二叉树~

那么我们就遍历两次、存储结果比对就可以确定是不是同一颗啦~

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 100
//二叉排序树
typedef struct BiTNode{
	int data;
	struct BiTNode * lchild,*rchild;
}BiTNode,*BiTree;
//思路 通过前序遍历 和 中序遍历 确定一颗唯一的二叉排序树
int sum[MAXSIZE][3]={0};  //分别每个树存放先序遍历 和 中序遍历 的 值
int flag=0;
BiTree Insert(BiTree p,int i){
	//二叉排序树的建立
	if ( p==NULL ) {
		p = (BiTree)malloc(sizeof(BiTNode));
		p->data = i;
		p->lchild = p->rchild = NULL;
	} else if ( i>=p->data ) {
		p->rchild=Insert(p->rchild,i);
	} else {
		p->lchild=Insert(p->lchild,i);
	}
	return p;
}

void PreOrder(BiTree p,int i){
	if(p!=NULL){
		//先序遍历
		sum[i][1]=sum[i][1]*10+p->data;
		PreOrder(p->lchild,i);
		PreOrder(p->rchild,i);
	}

}


void MOrder(BiTree p,int i){
	if(p!=NULL){
		//中序遍历
		MOrder(p->lchild,i);
		sum[i][0]=sum[i][0]*10+p->data;
		MOrder(p->rchild,i);
	}

}

void IfSame(){
	int a,b;
	int i,j,k;
	int n;
	int count = 1;
	
	scanf("%d",&n); //n个需要判断
	if(n==0){
		flag++;
		exit(0);
	}
	n++;
	//将序列按字符串输入
	char end[2]="0";
	char numbers[MAXSIZE][10]={'\0'};
	scanf("%s",&numbers[0]);
	int len = strlen(numbers[0]);
	i=1;
	while(1){
		
		if(count==n){
			break;
		}
		scanf("%s",&numbers[i]);
		strcpy(numbers[count],numbers[i]);
		count++;
		i++;
	}
	//字符串转换为数字
	//	count--; //count wei bijiaode geshu
	int nums[MAXSIZE][10]={0};
	for(i=0;i<n;i++){
		for(j=0;j<len;j++){
			nums[i][j]=numbers[i][j]-'0';
		}
	}
	
	//二叉排序树的生成
	BiTree T[MAXSIZE]={NULL};
	for(i=1;i<=n;i++){
		for(j=0;j<len;j++){
			
			T[i]=Insert(T[i],nums[i-1][j]);
		}
		PreOrder(T[i],i);
		MOrder(T[i],i);
		
	}
	//比对
	for(i=2;i<=n;i++){
		
		
		if(sum[i][1]==sum[1][1]&&sum[i][0]==sum[1][0]){
			printf("YES\n");
		}
		else{
			printf("NO\n");
		}
		
		
	}
}
int main(){
	
	while(1){
		IfSame();
		if(flag!=0){
			exit(0);
		}
	}
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_41673825/article/details/122187358