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