九度上的一个题如下:
-
题目描述:
-
判断两序列是否为同一二叉搜索树序列
-
输入:
-
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
-
输出:
-
如果序列相同则输出YES,否则输出NO
-
样例输入:
-
2 567432 543267 576342 0
-
样例输出:
-
YES NO
#include<stdio.h>
#include<malloc.h>
#include<string.h>
typedef struct Node
{
int data;
Node * l,*r;
}Node;
void insert(Node * root,int data)
{
if(!root) return;
while(1)
{
if(root->data > data && root->l) root = root->l;
else if(root->data < data && root->r) root = root->r;
else if(root->data == data) return;
else break;
}
if(root->data > data)
{
Node * newNode = (Node *)malloc(sizeof(Node));
newNode->l = newNode->r = NULL;
newNode->data = data;
root->l = newNode;
}else if(root->data < data)
{
Node * newNode = (Node *)malloc(sizeof(Node));
newNode->l = newNode->r = NULL;
newNode->data = data;
root->r = newNode;
}
}
int compareTree(Node * s,Node * t)
{
if(!s && !t) return 1;
if(!s || !t) return 0;
if(s->data != t->data)
{
return 0;
}
if(compareTree(s->l,t->l) && compareTree(s->r,t->r)) return 1;
return 0;
}
Node * createTree(Node * root,char s[])
{
int len = strlen(s);
for(int i = 1; i < len; i++)
{
insert(root,s[i]-'0');
}
return root;
}
// 这个方法在此程序没用,我写着玩的
void inOrder(Node * root)
{
if(!root) return;
else
{
inOrder(root->l);
printf("%d",root->data);
inOrder(root->r);
}
}
int main()
{
int n;
char s1[11],s2[11];
while(scanf("%d",&n)!=EOF && n)
{
scanf("%s",s1);
Node * root1 = (Node *)malloc(sizeof(Node));
root1->data = s1[0]-'0';
root1->r = root1->l = NULL;
root1 = createTree(root1,s1);
for(int i = 0;i < n; i++)
{
scanf("%s",s2);
Node * root2 = (Node *)malloc(sizeof(Node));
root2->l = root2->r = NULL;
root2->data = s2[0]-'0';
root2 = createTree(root2,s2);
if(compareTree(root1,root2))
{
printf("%s\n","YES");
}else
{
printf("%s\n","NO");
}
}
}
return 0;
}