给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。
方法:
为每个序列建树,并利用每棵树的中序遍历判断相同
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct BSTree {
int data;
struct BSTree* left;
struct BSTree* right;
}*BST,BSTree;
BST Insert_Tree(BST root, int key) {
if (root == NULL) {
root = (BST)malloc(sizeof(BSTree));
root -> data = key;
root -> left = NULL;
root -> right = NULL;
return root;
}
else {
if (root -> data > key) {
root -> left = Insert_Tree(root -> left, key);
}
else if (root -> data < key) {
root -> right = Insert_Tree(root -> right, key);
}
return root;
}
}
int order1[20];
int order2[20];
int num = 0;
int num1 = 0;
void Pre_Tree_Fir(BST root) {
if (root == NULL) {
return;
}
Pre_Tree_Fir(root -> left);
Pre_Tree_Fir(root -> right);
order1[num++] = root -> data;
return ;
}
void Pre_Tree_Sec(BST root) {
if (root == NULL) {
return;
}
Pre_Tree_Sec(root -> left);
Pre_Tree_Sec(root -> right);
order2[num1++] = root -> data;
return ;
}
int main() {
int n, l;
int i, j, k;
while(~scanf("%d",&n)){
if (n == 0) {
break;
}
scanf("%d",&l);
BST root = NULL, root1 = NULL;
num = 0;
num1 = 0;
for (i = 0; i < n; i++) {
int a;
scanf("%d", &a);
root = Insert_Tree(root, a);
}
Pre_Tree_Fir(root);
while(l --) {
root1 = NULL;
num1 = 0;
for (i = 0; i < n; i++) {
int a;
scanf("%d",&a);
root1 = Insert_Tree(root1, a);
}
Pre_Tree_Sec(root1);
int flag = 1;
for (i = 0; i <= n; i++) {
if (order1[i] != order2[i]) {
flag = 0;
break;
}
}
if (flag) {
printf("Yes\n");
}
else {
printf("No\n");
}
}
}
return 0;
}