http://acm.hdu.edu.cn/showproblem.php?pid=3791&&二叉搜索树

来源:互联网 发布:话剧暗恋桃花源知乎 编辑:程序博客网 时间:2024/05/09 13:46

Problem Description
判断两序列是否为同一二叉搜索树序列

Input
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。

Output
如果序列相同则输出YES,否则输出NO

Sample Input
25674325432675763420

Sample Output
YESNO
解题思路:二叉搜索树,又称为二叉排序树,其性质:通过对二叉排序树的中序遍历,即得到从小到大排列。在建树的过程中进行比较,一旦不相等就结束。
AC代码:
#include<iostream>#include<string.h>#include<string>#include<memory.h>#define CLR(arr,val) memset(arr,val,sizeof(arr))#define N  2<<11//注意易错点using namespace std;char s[N];char _s[N];char s1[N];int flag;void Build(char ch,int pos,int ans){if(_s[pos]==-1){_s[pos]=ch;if(ans)if(ch!=s[pos]) flag=false;return;}if(ch>_s[pos]) Build(ch,pos<<1 | 1,ans);else           Build(ch,pos<<1,ans);}void solve(bool ans){flag=true;for(int i=0;i<strlen(s1);++i){if(!flag) return;Build(s1[i],1,ans);}}int main(){int n;while(~scanf("%d",&n),n){CLR(_s,-1);scanf("%s",s1);int len=strlen(s1);solve(0);memcpy(s,_s,strlen(_s));//for(int i=0;i!=n;++i){CLR(_s,-1);scanf("%s",s1);    int res=strlen(s1);if(res!=len){puts("NO");continue;}solve(1);if(flag) puts("YES");else     puts("NO");}}return 0;}