1. 程式人生 > >BST 二叉搜尋樹 (動態建樹與靜態建樹)

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;
}