判断两序列是否为同一二叉搜索树序列
输入描述:
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
输出描述:
如果序列相同则输出YES,否则输出NO
示例1
输入
2
567432
543267
576342
0
输出
YES
NO
解题思路:
包含中序遍历结果在内的两种遍历结果可以唯一确定一棵二叉树,那么我们只需对两棵树进行包括中序遍历在内的两种遍历,若两种遍历的结果都相同,那么就可以判定两棵二叉树是完全相同的。
在这里我们使用的是中序遍历+后序遍历
AC代码:
#include<iostream>
#include<stdio.h>
#include<string.h>
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;
}

本文介绍了一种算法,用于判断两个序列是否能构成同一颗二叉搜索树。通过中序遍历和后序遍历,该算法能够有效确定两棵树是否完全相同,适用于竞赛编程和数据结构学习。
1374

被折叠的 条评论
为什么被折叠?



