04-树4 是否同一棵二叉搜索树 (25分)

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);
}

猜你喜欢

转载自blog.csdn.net/m0_43429389/article/details/107667803