每日一题(九):二叉搜索树

题目:判断两序列是否为同一二叉搜索树


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

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

Sample Input 

2
567432 
543267 
576342 
0

Sample Output 
YES 
NO
 

#include<string.h>
#include<stdio.h>
struct Node{
	Node *lchild;
	Node *rchild;
	int c;
}Tree[110];
int loc;
Node *creat() {   //申请未使用的结点
	Tree[loc].lchild == NULL;
	Tree[loc].rchild == NULL;
	return &Tree[loc++];
}
char str1[25], str2[25];   //保存二叉排序树的遍历结果,
                          //将每一棵树的前序遍历得到的字符串与中序遍历得到的字符串连接
                          //得到遍历结果字符串
int size1, size2;         //保存在字符数组中的遍历得到字符个数
char *str;                //当前正在保存字符串
int *size;                //当前正在保存字符串中的个数
  
void postOrder(Node *T) {
	if (T->lchild != NULL)
		postOrder(T->lchild);
	if (T->rchild != NULL)
		postOrder(T->rchild);
	str[(*size)++] = T->c + '0';   //将结点中的字符放入正在保存的字符串中
}
void inOrder(Node *T) {
	if (T->lchild != NULL)
		inOrder(T->lchild);
	str[(*size)++] = T->c + '0';
	if (T->rchild != NULL)
		inOrder(T->rchild);
}
void preOrder(Node *T) {
	str[(*size)++] = T->c + '0';
	if (T->lchild != NULL)
		preOrder(T->lchild);
	if (T->rchild != NULL)
		preOrder(T->rchild);
}
Node *Insert(Node *T, int x) {  //插入数字
	if (T == NULL) {            //若当前树为空
		T = creat();            //建立结点
		T->c = x;               //数字直接插入其根结点
		return T;               //返回根结点指针
	}
	else if (x < T->c)          //若x小于根结点数值
		T->lchild = Insert(T->lchild, x);//插入到左子树上
	else if (x > T->c)
		T->rchild = Insert(T->rchild, x);
	return T;
}
int main() {
	int n;
	char tmp[12];
	while (scanf("%d", &n) != EOF&&n != 0) {
		loc = 0;
		Node *T = NULL;
		scanf("%s", tmp);
		for (int i = 0; tmp[i] != 0; i++) {
			T = Insert(T, tmp[i] - '0');//按顺序将数字插入二叉排序树
		}
		size1 = 0;       //保存在第一个字符串中的字符初始化为0
		str = str1;      //将正在保存字符串设定为第一个字符串
		size = &size1;
		preOrder(T);
		inOrder(T);
		str1[size1] = 0;  //向第一个字符串的最后一个字符添加空字符,方便使用字符串函数
		while (n-- != 0) {
			scanf("%s", tmp);
			Node *T2 = NULL;
			for (int i = 0; tmp[i] != 0; i++) {
				T2 = Insert(T2, tmp[i] - '0');
			}
			size2 = 0;
			str = str2;
			size = &size2;
			preOrder(T2);
			inOrder(T2);
			str2[size2] = 0;
			puts(strcmp(str1, str2) == 0 ? "YES" : "NO");
		}
	}
	return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值