九度OJ刷题——1009:二叉搜索树
- 题目描述:
-
判断两序列是否为同一二叉搜索树序列
- 输入:
-
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
- 输出:
-
如果序列相同则输出YES,否则输出NO
- 样例输入:
-
2 567432 543267 576342 0
- 样例输出:
-
YES NO
这题我的思路是将序列转换成用数组表示的二叉树,然后比较两个数组是否相同即可。
源代码:#include <iostream> #include <cstring> using namespace std; const int N = 10000; int sTree[N]; int dTree[N]; void string2Tree(char *s, int *tree); void insert(char c, int *tree); bool isSameTree(); int main(){ int n; while(cin>>n && n){ memset(sTree, -1, sizeof(sTree)); char s[1000], d[1000]; cin >> s; string2Tree(s, sTree); for(int i=0; i<n; i++){ cin >> d; if(strlen(s) != strlen(d)){ cout << "NO" << endl; continue; } memset(dTree, -1, sizeof(dTree)); string2Tree(d, dTree); if(isSameTree()) cout << "YES" << endl; else cout << "NO" << endl; } } return 0; } void string2Tree(char *s, int *tree){ int len = strlen(s); tree[1] = s[0] - '0'; for(int i=1; i<len; i++){ insert(s[i], tree); } } void insert(char c, int *tree){ int curPos = 1; int curChar = c - '0'; while(tree[curPos] != -1){ if(tree[curPos] < curChar){ curPos = 2 * curPos + 1; } else{ curPos = 2 * curPos; } } tree[curPos] = curChar; } bool isSameTree(){ for(int i=1; i<N; i++){ if(sTree[i] != dTree[i]) return false; } return true; }