本节对数据结构中二叉树的排序插入,根据遍历序列还原二叉树,判断二叉树是否为同一个搜索二叉树进行了练习。
//输入一串整数,建立二叉排序树,并进行前序、中序、后序遍历
/*输入第一行包括 一个整数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;
}