04-树4 是否同一棵二叉搜索树 (25分)
思路分析:本体整体的思路很明显,先输入二叉搜索树的结点个数,然后输入要比较的二叉搜索树的个数,之后进入循环迭代,首先要构建一个要进行比较的模板二叉树,然后再构建要比较的函数,这里用到了很多函数的方法,值得注意的是C++的实现,必须在main函数之前提供函数的声明。
Tree makeNewTree(int n );用来生成二叉搜索树
Tree treeNewNode(int v);生成新的结点
Tree insert(Tree T, int v);因为是通过用户输入的值进行插入,所以需要这个函数
int check(Tree T, int v);检查这个结点之前是否出现,改变flag的值
int judge(Tree T, int n);判断两棵树是否相同
void ResetT(Tree T);重置flag值,为后面要生成的树做准备
void FreeTree(Tree T);释放已经比较过的二叉搜索树
#include <iostream>
using namespace std;
typedef struct TNode * Tree;
struct TNode
{
int data;
Tree left, right;
int flag;
};
Tree makeNewTree(int n );
Tree treeNewNode(int v);
Tree insert(Tree T, int v);
int check(Tree T, int v);
int judge(Tree T, int n);
void ResetT(Tree T);
void FreeTree(Tree T);
int main ()
{
int n, testn;
Tree T;
int i = 1;
cin >> n;
cin >> testn;
while(n)
{
T = makeNewTree(n);
for(i = 0;i<testn; i++)
{
if(judge(T,n)) cout<<"Yes"<<endl;
else cout << "No"<<endl;
ResetT(T);
}
FreeTree(T);
cin >> n;
cin >> testn;
}
return 0;
}
Tree makeNewTree(int n )
{
Tree T;
int v,i = 0;
if(!n) return NULL;
else
{
cin >> v;
T = treeNewNode(v);
for(i = 1; i<n;i++)
{
cin >> v;
T = insert(T,v);
}
return T;
}
}
Tree treeNewNode(int v)
{
Tree T;
T = (Tree)malloc(sizeof(struct TNode));
T->data = v;
T->right = T->left =NULL;
T->flag = 0;
return T;
}
Tree insert(Tree T, int v)
{
if(!T) T = treeNewNode(v);
else
{
if(v > T->data) T->right = insert(T->right,v);
else T->left = insert(T->left, v);
}
return T;
}
int check(Tree T, int v)
{
if(T->flag)
{
if(v > T->data) return check(T->right,v);
else if(v < T->data) return check(T->left,v);
else return 0;
}else
{
if(v == T->data)
{
T->flag = 1;
return 1;
}else return 0;
}
}
int judge(Tree T, int n)
{
int i, v ,flag = 0;//0 代表一致,1 代表不一致
cin >> v;
if(v!=T->data) flag = 1;
else T->flag = 1;
for(i = 1; i<n;i++)
{
cin >> v;
if(!flag&&(!check(T,v))) flag = 1;
}
if(flag) return 0;
else return 1;
}
void ResetT(Tree T)
{
if(T->left) ResetT(T->left);
if(T->right) ResetT(T->right);
T->flag = 0;
}
void FreeTree(Tree T)
{
if(T->left) FreeTree(T->left);
if(T->right) FreeTree(T->right);
free(T);
}