题目
给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{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
总结出现的问题,每次新建一个节点以后,没有把他们和原来的连接起来,原因是没有用引用,用的值传递。(多犯几次错误总会记住的)。一定要多多测试。
#include<iostream>
using namespace std;
typedef struct BTreeNode* TNode;
struct BTreeNode {
int data;
BTreeNode* left;
BTreeNode* right;
};
class MYBST {
public:
TNode root = NULL;
TNode Create(int n);
void insertNode(TNode &t, int k);
bool Compare(TNode T, TNode t);
//void Tranverse(TNode T);
};
//建树
TNode MYBST::Create(int n)
{
for(int i = 0; i < n; i++)
{
int k;
cin >> k;
insertNode(root, k);
}
return root;
}
//插入节点
void MYBST::insertNode(TNode &t,int k)
{
if (!t)
{
t = new BTreeNode;
t->data = k;
t->left = NULL;
t->right = NULL;
return;
}
if (k < t->data)
insertNode(t->left, k);
else
insertNode(t->right, k);
}
//比较两棵树
bool MYBST::Compare(TNode T,TNode t)
{
if (!T && !t)
return true;
else if ((T && !t) || (!T&&t))
return false;
else if (T->data == t->data)
return Compare(T->left, t->left) && Compare(T->right, t->right);
else
return false;
}
//遍历
//void MYBST::Tranverse(TNode T)
//{
// if (!T)
// return;
// cout << T->data << " 测试 ";
// Tranverse(T->left);
// Tranverse(T->right);
//}
int main()
{
int n;
cin >> n;
while (n)
{
MYBST BST;
int L;
cin >> L;
MYBST t[1000];
BST.root = BST.Create(n);
//BST.Tranverse(BST.root);
for (int i = 0; i < L; i++)
{
t[i].root = t[i].Create(n);
//t[i].Tranverse(t[i].root);
bool flag = BST.Compare(BST.root,t[i].root);
if (flag)
cout << "Yes" << endl;
else
cout << "No" << endl;
}
cin >> n;
}
system("pause");
return 0;
}