C 数据结构之二叉排序树

本节对数据结构中二叉树的排序插入,根据遍历序列还原二叉树,判断二叉树是否为同一个搜索二叉树进行了练习

//输入一串整数,建立二叉排序树,并进行前序、中序、后序遍历 

/*
输入第一行包括 一个整数n,接下来一行包括n个整数
样例输入 5
1 6 5 9 8
样例输出


1 6 5 9 8
1 5 6 8 9
5 8 9 6 1


对二叉树插入数字 x,1,若当前树为空,其为根节点。2.若当前节点大于x,插入左子树,小于x,插入右子树。 

*/ 

#include<stdio.h>
#include<string.h>
struct Node//二叉树结构体
{
    Node *lchild;//左儿子指针
    Node *rchild;//右
    int c;
}Tree[110];
int loc;//静态数组中被使用个数
Node *creat()
{//申请未使用节点
   Tree[loc].lchild=Tree[loc].rchild=NULL;
   return &Tree[loc++];
}
void postOrder(Node *T)
{//后序遍历
   if(T->lchild!=NULL)
   {
   postOrder(T->lchild);
   }
   if(T->rchild!=NULL)
   {
      postOrder(T->rchild);
   }
   printf("%d ",T->c);
}
void inOrder(Node *T)
{//中序遍历
   if(T->lchild!=NULL)
   {
     inOrder(T->lchild);
   }
    printf("%d ",T->c);
   if(T->rchild!=NULL)
   {
      inOrder(T->rchild);
   }
  
}	  
//前序遍历
void preOrder(Node *T)
{
   printf("%d ",T->c);
   if(T->lchild!=NULL)
   {
     preOrder(T->lchild);
   }  
   if(T->rchild!=NULL)
   {
      preOrder(T->rchild);
   }
}	  
Node *Insert(Node *T,int x)
{//插入数字
   if(T==NULL)
   {
     T=creat();//若当前树为空,建立节点,数字直接插入其根节点,返回根结点指针
     T->c=x;
	 return T;
   }
	 else if(x<T->c)//若x小于根节点
            T->lchild=Insert(T->lchild,x);//插入左子树
      else if(x>T->c)
		     T->rchild=Insert(T->rchild,x); //若x大于根节点数值
                                           //插入到右子树
      return T;//返回根节点
}
int main()
{
	int n;
	while(scanf("%d",&n)!=EOF)
	{
		loc=0;
    	Node *T=NULL;//二叉树根节点为空
    	for(int i=0;i<n;i++)
        	{//依次输入n个数字

		      int x;
		      scanf("%d",&x);
		      T=Insert(T,x);  //插入到排序树中 
         	}   
			 preOrder(T);
			 printf("\n"); 
			 inOrder(T);
			 printf("\n"); 	
			 postOrder(T);
			 printf("\n"); 		
	}
	return 0;
}

判断两棵树是否相同,我们不能简单的用某一种遍历方式去遍历两棵树,并判断两棵树是否相同。若想判断一棵树是否相同,要判断这棵树包括中序遍历在内的两种遍历结果是否相同。

//判断两序列是否为同一二叉搜索树
/*
开始一个数n,表示有n个需要判断。n=0结束。接下来一行是一个序列,长度小于10 没有重复数字,根据这个序列可以构造出一个二叉树
接下来有n行序列,请判断这两个序列是否能组成同一个序列,相同输出YES,否则输出NO
2
567432
543267
576342
0
输出YES NO
我们对输入的数字序列构建二叉排序树,并对他们进行前序中序遍历,依次比较遍历结果是否相同,若相同则相同否则不同 

*/ 

#include<stdio.h>
#include<string.h>
struct Node
{
	Node *lchild;
	Node *rchild;
	int c;
}Tree[110];
//树节点结构体 
int loc;
Node *creat()
{
	Tree[loc].lchild=Tree[loc].rchild=NULL;
	return &Tree[loc++];
}
//申请节点空间 
char str1[25],str2[25];
//保存二叉树的遍历结果,将遍历结果字符串连接,得到遍历结果字符串 
int size1,size2;//保存在字符数组中的遍历得到字符个数 
char *str;
int *size;
//后序遍历 
void postOrder(Node *T)
{
	if(T->lchild!=NULL)
	{
		postOrder(T->lchild);
	}
	if(T->rchild!=NULL)
	{
		postOrder(T->rchild);
	}
	str[(*size)++]=T->c+'0';
}

//中序遍历 
void inOrder(Node *T)
{
	if (T->lchild!=NULL)
	{
		inOrder(T->lchild);
	}
	str[(*size)++]=T->c;
	if(T->rchild!=NULL)
	{
		inOrder(T->rchild);
	}
}
//将数字插入二叉树 
Node *Insert(Node *T,int x)
{
	if (T==NULL)
	{
		T=creat();
		T->c=x;
		return T;
	}
	else if(x<T->c)
	{
		T->lchild=Insert(T->lchild,x);
	}
	else if(x>T->c)
	{
		T->rchild=Insert(T->rchild,x);
	}
	return T;
}

int main()
{
	int n;
	char tmp[12];
	while(scanf("%d",&n)!=EOF && n!=0)
	{
		loc=0;//初始化静态空间为未使用 
		Node *T=NULL;
		scanf("%s",tmp);
	    for(int i=0;tmp[i]!=0;i++)
		{
			T=Insert(T,tmp[i]-'0');//按序插入二叉排序树	
		}
		size1=0;
		str=str1;//将正在保存字符串设为第一个字符串 
		size=&size1;。。//将正在保存字符串中的字符个数指针指向size1 
		postOrder(T);
		inOrder(T);
		str1[size1]=0;//向第一个字符串的最后一个字符后添加空字符,方便使用字符串函数 
		while(n--!=0)
		{
			scanf("%s",tmp);
			Node *T2=NULL;
			for(int i=0;tmp[i]!=0;i++)
			{
				T2=Insert(T2,tmp[i]-'0');//建立二叉排序树 
				
			}
			size2=0;
			str=str2;
			size=&size2;
			postOrder(T2);
			inOrder(T2);
			str2[size2]=0;
			puts(strcmp(str1,str2)==0 ? "YES":"NO");//比较两个遍历字符串,相同yes否则 no 
		}
	}
	return 0;
}
 

猜你喜欢

转载自blog.csdn.net/joanna_or_zhouzhou/article/details/80349058