BST 二叉搜索树 (动态建树与静态建树)

//判断两棵树是否是同一棵树:先序遍历和中序遍历对应相同或者中序遍历和后序遍历对应相同 
//代码思路:两个数组分别存放建好的树的先序遍历以及正序遍历结果,然后对比是否相等  
//题目意思  这题是 HDU 3791
题目描述:
判断两序列是否为同一二叉搜索树序列
输入:
开始一个数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<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
typedef struct TiNode
{
	char data;
	struct TiNode *left,*right;
}TiNode,*BiTree;
char prearr[15],prearr2[15];
char midarr[15],midarr2[15];
void buildtree(BiTree &T,int x)//建树 
{
	if(T==NULL)
	{
		T=(BiTree)malloc(sizeof(BiTree));
		T->data=x;
		T->left=NULL;
		T->right=NULL;
	}
	else if(x<T->data)
	{
		buildtree(T->left,x) ;
	}
	else if(x>T->data)
	{
		buildtree(T->right,x); 
	}
}
void Presearch(BiTree T,int &index)//先序遍历 
{
	prearr[index++]=T->data;
	if(T->left!=NULL)
	Presearch(T->left,index);
	if(T->right!=NULL)
	Presearch(T->right,index);	
}
void Midsearch(BiTree T, int &index)//中序遍历 
{
	if(T->left!=NULL)
	Midsearch(T->left,index);
	midarr[index++]=T->data;
	if(T->right!=NULL)
	Midsearch(T->right,index);
	
}
int main()
{
	int N,index;
	char str[15],str2[15];
	while(scanf("%d",&N)!=EOF&&N!=0)
	{
	    BiTree T=NULL;
	    scanf("%s",str);
	    for(int k=0;k<strlen(str);k++)
		{
			buildtree(T,str[k]);//建树 
		}
		index=0;
		Presearch(T,index) ;
		prearr[index]='\0';
		strcpy(prearr2,prearr);
		index=0;
		Midsearch(T,index);
		midarr[index]='\0';
		strcpy(midarr2,midarr);
		for(int i=0;i<N;i++)
		{
			T=NULL;
			scanf("%s",str2);
			for(int g=0;g<strlen(str2);g++)
			{
				buildtree(T,str2[g]);
			}
			index=0;
			Presearch(T,index);
			prearr[index]='\0';
			if(strcmp(prearr,prearr2)!=0)
			{
			printf("NO\n");
			continue;
			}
		index=0;
		Midsearch(T,index);
		midarr[index]='\0';
	   if(strcmp(midarr,midarr2)!=0)
		{
			printf("NO\n");
			continue;
		}
		printf("YES\n");
		free(T);	
	}
	}
	return 0;
}
  



//还是这个题意,我们换一种建树方法,这次采用静态建树的方法

#include <iostream>
using namespace std;
#include <cstring>
#define MAX 666
int node[MAX];
int node2[MAX];
void makeTree(char *str,int *node)
{
	for(int i=0;str[i]!='\0';i++)
	{
		int j=0;
		int t=str[i]-'0';
		while(node[j]!=-1)
		{
			if(t>node[j])
				j=(j+1)*2;
			if(t<node[j])
				j=(j+1)*2-1;
		}
		node[j]=t;
	}
}
void compare()
{
	for(int i=0;i<MAX;i++)
		if(node[i]!=node2[i])
		{
			cout<<"NO"<<endl;
			return;
		}
		cout<<"YES"<<endl;
}
int main()
{
	int n;
	char str[12],str2[12];
	cin>>n;
	if(!n)
	    return 0;
	memset(node,-1,sizeof(node));
	cin>>str;
	makeTree(str,node);
	int len=strlen(str);
	while(n--)
	{
		memset(node2,-1,sizeof(node2));
		cin>>str2;
		int len2=strlen(str2);
		if(len!=len2)
		{
			cout<<"NO"<<endl;
			continue;
		}
		makeTree(str2,node2);
		compare();
	}
	main();
	return 0;
}




发布了34 篇原创文章 · 获赞 109 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/huihui1094667985/article/details/70768729