给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。
输入格式:
输入包含若干组测试数据。每组数据的第1行给出两个正整数N (≤10)和L,分别是每个序列插入元素的个数和需要检查的序列个数。第2行给出N个以空格分隔的正整数,作为初始插入序列。随后L行,每行给出N个插入的元素,属于L个需要检查的序列。
简单起见,我们保证每个插入序列都是1到N的一个排列。当读到N为0时,标志输入结束,这组数据不要处理。
输出格式:
对每一组需要检查的序列,如果其生成的二叉搜索树跟对应的初始序列生成的一样,输出“Yes”,否则输出“No”。
输入样例:
4 2
3 1 4 2
3 4 1 2
3 2 4 1
2 1
2 1
1 2
0
输出样例:
Yes
No
No
这里我在第二的测试案例卡了一会,最后发现这道题所规定的二叉搜索树不能存在相同的值,虽然输入的数可能会有相同的值,在insert中改了一个地方就好了。在就是一开始写的时候一直用的NULL代替空指针,写道一半发现NULL与int比较时会转化为0, 就换成nullptr了,它只会隐式转化为false,总而言之,以后尽量使用nullptr表示空指针
#include<iostream>
#include<vector>
using namespace std;
// 定义节点结构体,表示二叉树的一个节点
struct node {
int num; // 节点值
node* lchild; // 左子节点指针
node* rchild; // 右子节点指针
// 构造函数,用于初始化节点
node(int n) : num(n), lchild(nullptr), rchild(nullptr) {
}
};
// 将节点p插入树中
void insert(node* root, node* p) {
if (root->lchild == nullptr && p->num < root->num) {
root->lchild = p;
return;
}
if (root->rchild == nullptr && p->num > root->num) {
root->rchild = p;
return;
}
if (p->num < root->num) {
insert(root->lchild, p);
}
if (p->num > root->num) {
insert(root->rchild, p);
}
}
// 创建包含n个节点的二叉搜索树
node* create(int n) {
vector<int> st(n); // 用于存储输入的节点值
node* root; // 树的根节点指针
for (int i = 0; i < n; i++) {
cin >> st[i]; // 读取节点值
}
root = new node{st[0]}; // 将第一个数字作为根节点
for (int i = 1; i < n; i++) {
node* p = new node{st[i]}; // 创建新节点
insert(root, p); // 将节点插入树中
}
return root;
}
// 递归比较两棵二叉树是否相同
bool comparison(node* root1, node* root2) {
if (root1 == nullptr && root2 == nullptr)
return true;
if (root1 == nullptr || root2 == nullptr)
return false;
if (root1->num != root2->num)
return false;
return comparison(root1->lchild, root2->lchild) && comparison(root1->rchild, root2->rchild);
}
int main() {
int n;
cin >> n; // 输入初始树的节点数
while (n != 0) {
int l;
cin >> l; // 输入要比较的树的数量
node* t1; // 储存初始树的指针
t1 = create(n); // 创建初始树
for (int k = 0; k < l; k++) {
node* t = create(n); // 创建新的树
if (comparison(t1, t)) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
}
cin >> n; // 重新输入初始树的节点数
}
return 0;
}