二叉搜索树 九度教程第36题 判断两颗二叉树是否相同

题目链接

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

解题思路:
包含中序遍历结果在内的两种遍历结果可以唯一确定一棵二叉树,那么我们只需对两棵树进行包括中序遍历在内的两种遍历,若两种遍历的结果都相同,那么就可以判定两棵二叉树是完全相同的。
在这里我们使用的是中序遍历+后序遍历

AC代码:

#include
#include
#include
using namespace std;
struct node {
	node *left;
	node *right;
	int num;
}tree[105];//静态数组
str1用于保存原始的二叉排序树的中序遍历和后序遍历
str2用于保存后来的二叉排序树的中序遍历和后序遍历
char str1[30], str2[30];
int cnt;//静态数组中被使用元素的个数
int num;//字符数组中被使用元素的个数
node *creat() {//申请新结点
	tree[cnt].left = tree[cnt].right = NULL;
	return &tree[cnt++];
}
node *build(int x, node *t) {
	if (t == NULL) {//若当前树为空
		t = creat();//建立新结点
		t->num = x;
	}
	else if (x < t->num) {//进入左子树
		t->left = build(x, t->left);
	}
	else if (x > t->num) {//进入右子树 若根结点数值与x相等,按照题目要求直接忽略
		t->right = build(x, t->right);
	}
	return t;//返回根结点指针
}
void in_order(node *root) {//中序遍历
	if (root == NULL) return;
	in_order(root->left);
	str2[num++] = root->num + '0';
	in_order(root->right);
}
void post_order(node *root) {//后序遍历
	if (root == NULL) return;
	post_order(root->left);
	post_order(root->right);
	str2[num++] = root->num + '0';
}
int main() {
	int n;
	while (cin >> n) {
		if (n == 0) break;
		scanf("%s", str1);
		int len = strlen(str1);
		cnt = 0; num = 0;
		node *t = NULL;
		for (int i = 0; i < len; i++) {//建立最开始的二叉排序树
			t = build(str1[i] - '0', t);
		}
		in_order(t);
		post_order(t);
		for (int i = 0; i < num; i++) {
			str1[i] = str2[i];//str1用于保存原始的二叉排序树的中序遍历和后序遍历
		}
		while (n--) {
			cnt = 0; num = 0;
			scanf("%s", str2);
			int len = strlen(str2);
			node *tt = NULL;
			for (int i = 0; i < len; i++) {//建立后来的的二叉排序树
				tt = build(str2[i] - '0', tt);
			}
			in_order(tt);
			post_order(tt);
			int i;
			for (i = 0; i < num; i++) {
				if (str1[i] != str2[i]) {
					break;
				}
			}
			if (i == num)cout << "YES" << endl;
			else cout << "NO" << endl;
		}
	}
	return 0;
}

你可能感兴趣的:(二叉树结构,机试指南之路,二叉树)