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

这篇博客主要介绍了如何判断两棵二叉搜索树是否相同,包括构建二叉搜索树、插入节点、检查节点是否存在以及判断树的等价性的方法。重点在于C++中函数的声明和实现,以及在比较过程中对状态的管理。
摘要由CSDN通过智能技术生成

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);
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值