-
题目描述:
-
判断两序列是否为同一二叉搜索树序列
-
输入:
-
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
-
输出:
-
如果序列相同则输出YES,否则输出NO
-
样例输入:
-
2 567432 543267 576342 0
-
样例输出:
-
YES
NO
-
[解题思路]
-
构造两棵二叉树然后进行依次比较左右儿子,两棵二叉树为不同树的条件为:
-
[构造二叉搜索树]int judgeTree(tree t1,tree t2){ if(t1!=NULL&&t2!=NULL){ /* *相同节点对应值不同 */ if(t1->n!=t2->n) return 0; if(!judgeTree(t1->left,t2->left)) return 0; if(!judgeTree(t1->right,t2->right))return 0; } /* *相同节点对应的结构不同(含有的儿子数目不同) */ else if((t1!=NULL&&t2==NULL)||(t1==NULL&&t2!=NULL)){ return 0; } return 1; }
-
[程序源代码]void insertNum(tree& t,int data){ if(t==NULL){ t=(tree)malloc(sizeof(Node)); t->n=data; t->left=NULL; t->right=NULL; } else{ if(data<t->n) insertNum(t->left,data); else insertNum(t->right,data); } }
-
#include<stdio.h> #include<malloc.h> typedef struct Node* tree; struct Node{ tree left; tree right; int n; }; void insertNum(tree& t,int data){ if(t==NULL){ t=(tree)malloc(sizeof(Node)); t->n=data; t->left=NULL; t->right=NULL; } else{ if(data<t->n) insertNum(t->left,data); else insertNum(t->right,data); } } int judgeTree(tree t1,tree t2){ if(t1!=NULL&&t2!=NULL){ /* *相同节点对应值不同 */ if(t1->n!=t2->n) return 0; if(!judgeTree(t1->left,t2->left)) return 0; if(!judgeTree(t1->right,t2->right))return 0; } /* *相同节点对应的结构不同(含有的儿子数目不同) */ else if((t1!=NULL&&t2==NULL)||(t1==NULL&&t2!=NULL)){ return 0; } return 1; } int main(){ int n; while(scanf("%d",&n),n){ tree t1=NULL; getchar(); int i,j; char ch; while((ch=getchar())!='\n'){ insertNum(t1,ch-48); } for(i=0;i<n;i++){ tree t2=NULL; while((ch=getchar())!='\n'){ insertNum(t2,ch-48); } if(!judgeTree(t1,t2))printf("NO\n"); else printf("YES\n"); free(t2); } } }
[题目网址] -
http://ac.jobdu.com/problem.php?pid=1009