Problem Description
判断两序列是否为同一二叉搜索树序列
Input
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
Output
如果序列相同则输出YES,否则输出NO
Sample Input
2 567432 543267 576342 0
Sample Output
YES NO
题解:二叉树存储,不知道怎么优化一下代码。 另:不能单纯只比序列顺序
#include <iostream> #include<cstdio> #include<cstring> using namespace std; struct node { int left,right,num; }tree[15],tree2[15]; int n,len; char ch[15]; void buildtree() { int i,k,j,l; for(i=1;i<=10;i++) { tree[i].num=0; tree[i].left=-1; tree[i].right=-1; } l=1; tree[1].num=ch[0]-'0'; for(i=1;i<len;i++) { k=ch[i]-'0'; j=1; while(1) { if (k>tree[j].num) { while(k>tree[j].num && tree[j].right!=-1) j=tree[j].right; if (tree[j].right==-1 && k>tree[j].num) { tree[++l].num=k; tree[j].right=l; break; } } if (k<tree[j].num) { while(k<tree[j].num && tree[j].left!=-1) j=tree[j].left; if (tree[j].left==-1 && k<tree[j].num) { tree[++l].num=k; tree[j].left=l; break; } } } } return; } void buildtree2() { int i,j,k,l; for(i=1;i<=10;i++) { tree2[i].num=0; tree2[i].left=-1; tree2[i].right=-1; } l=1; tree2[1].num=ch[0]-'0'; for(i=1;i<len;i++) { k=ch[i]-'0'; j=1; while(1) { if(k>tree2[j].num) { while(k>tree2[j].num && tree2[j].right!=-1) j=tree2[j].right; if (tree2[j].right==-1 && k>tree2[j].num) { tree2[++l].num=k; tree2[j].right=l; break; } } if(k<tree2[j].num) { while(k<tree2[j].num && tree2[j].left!=-1) j=tree2[j].left; if (tree2[j].left==-1 && k<tree2[j].num) { tree2[++l].num=k; tree2[j].left=l; break; } } } } return; } int compare(int i,int j) { if(i==-1 && j==-1) return 1; if(i*j<0) return 0; if (tree[i].num==tree2[j].num) { if(!compare(tree[i].right,tree2[j].right)) return 0; if(!compare(tree[i].left,tree2[j].left)) return 0; return 1; } else return 0; } int main() { while(scanf("%d",&n),n!=0) { scanf("%s",&ch); len=strlen(ch); buildtree(); for(;n>0;n--) { scanf("%s",&ch); buildtree2(); if (compare(1,1)) printf("YES\n"); else printf("NO\n"); } } return 0; }