Problem Description
判断两序列是否为同一二叉搜索树序列
Input
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。 接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。 接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
Output
如果序列相同则输出YES,否则输出NO
Sample Input
2 567432 543267 576342 0
Sample Output
YES NO
题意
先给你一个数字n,接着是一串数字,顺序扫描后建立一棵二叉搜索树。然后再陆续给n串数字,判断它们遍历的二叉树和第一个二叉树是否相同。
题目给出的字符串长度不大于10.每个数字在0~9之间。且给出的数字不会有重复。
分析
数据结构的题目,可以直接自定义个二叉树结点的结构来做。但比较复杂,题目已给出数字长度不会大于10.所以直接用静态的链表(即数组)来解就可以了。要是数字的个数太多就不能这样做。
- 假设用于存储的数组为tree。那么根节点保存在tree[0],而左儿子保存在tree[1],右儿子保存在tree[2]。
- 可知父节点与子节点之间的换算关系是这样的:若父节点为 i ,那么左儿子为(i+1)*2-1,右儿子为(i+1)*2。
- 所以我们要做的就是分别用两个int数组来保存前后两个字符串建立的二叉树。然后去比较这两个数组是否相等就可以了。
- 那么我们的node数组需要多大呢?10?9?错。这里要考虑所有可能的结点插入情况。其中最极端一种就是有9个结点,但是全部是右子树,这是最浪费空间的情况。此时树的深度是9。考虑深度为9的满二叉树的结点个数:2^9-1。只要大于这个数字就好。
#include<stdio.h> #include<string.h> #define max 512; int main() { int i,j,n,c; int tree[512],tree1[512]; char s[22]; while(scanf("%d",&n)!=EOF&&n!=0) { scanf("%s",s); memset(tree,-1,sizeof(tree)); for(i=0;s[i]!='