前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据结构实验之查找一:二叉排序树 (SDUT 3373)

数据结构实验之查找一:二叉排序树 (SDUT 3373)

作者头像
Lokinli
发布2023-03-09 18:44:16
1460
发布2023-03-09 18:44:16
举报
文章被收录于专栏:以终为始以终为始

二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),也称二叉搜索树。

代码语言:javascript
复制
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct node{

    int data;
    struct node *l, *r;
};

struct node *creat(struct node *root,int x)
{
        if(root == NULL)    // 如果 root 是空,表示当前是可以把这个点加进去的,就可以放进去了
        {
            root = new node;
            root -> data = x;
            root -> l = NULL;
            root -> r = NULL;
        }
        else {                      //如果不是,考虑两种情况
            if(x > root -> data)   //如果比当前的根节点大,去右子树找
               root -> r = creat(root -> r, x);
            else
               root -> l = creat(root -> l, x);  // 否则去左子树找
        }
        return root;   //别忘记了返回树根!
};
int ok(struct node *t1, struct node *t2)  // 判断两个树是否相同
{
    if(t1 == NULL && t2 == NULL)   // 如果比较到最下层都没有发现不同的就返回 1
        return 1;
    else if(t1 != NULL && t2 != NULL)  // 如果没有到最下层,继续向下找
    {
        if(t1 -> data != t2 -> data)  // 如果一旦发现不同的,就不满足了
        {
            return 0;
        }
        else if((ok( t1 -> l , t2 -> l) && ok(t1 -> r, t2 -> r))){  // 分别的左子树、右子树都要满足
            return 1;
        }
    }
    else return 0;
}
int a[55];
int b[55];
int main()
{
    int n,m;
    while(scanf("%d",&n)!=EOF && n)
    {
        scanf("%d",&m);
        struct node *root1,*root2;  // 这里需要树根节点(指针)
        for(int i = 0; i < n; i ++) {   // 先输入
            scanf("%d",&a[i]);
        }
        root1 = new node;
        root1 -> data = a[0];  // 把根放进去
        root1 -> l = root1 -> r = NULL;  // 左右结点初始化
        for(int i = 1; i < n; i ++){  // 建树
            root1 = creat(root1,a[i]);
        }
        while(m --)
        {
            for(int i = 0; i < n; i ++){   // 相同的建树方法
                scanf("%d",&b[i]);
            }
            root2 = new node;
            root2 -> data = b[0];
            root2 -> l = root2 -> r = NULL;
            for(int i = 1; i < n; i ++)
            {
                root2 = creat(root2,b[i]);
            }
            int f = ok(root1,root2);  // 比较
            if(f)printf("Yes\n");
            else printf("No\n");
        }
    }
    return 0;
}

改了一下建树的时候的不必要的步骤。(感谢wjh小哥哥)

代码语言:javascript
复制
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct node{

    int data;
    struct node *l, *r;
};

struct node *creat(struct node *root,int x)
{
        if(root == NULL)
        {
            root = new node;
            root -> data = x;
            root -> l = NULL;
            root -> r = NULL;
        }
        else {
            if(x > root -> data)
               root -> r = creat(root -> r, x);
            else
               root -> l = creat(root -> l, x);
        }
        return root;
};
int ok(struct node *t1, struct node *t2)
{
    if(t1 == NULL && t2 == NULL)
        return 1;
    else if(t1 != NULL && t2 != NULL)
    {
        if(t1 -> data != t2 -> data)
        {
            return 0;
        }
        else if((ok( t1 -> l , t2 -> l) && ok(t1 -> r, t2 -> r))){
            return 1;
        }
    }
    else return 0;
}
int a[55];
int b[55];
int main()
{
    int n,m;
    while(scanf("%d",&n)!=EOF && n)
    {
        scanf("%d",&m);
        struct node *root1,*root2;
        for(int i = 0; i < n; i ++) {
            scanf("%d",&a[i]);
        }
        root1 = NULL;
        for(int i = 0; i < n; i ++){
            root1 = creat(root1,a[i]);
        }
        while(m --)
        {
            for(int i = 0; i < n; i ++){
                scanf("%d",&b[i]);
            }
            root2 = NULL;
            for(int i = 0; i < n; i ++)
            {
                root2 = creat(root2,b[i]);
            }
            int f = ok(root1,root2);
            if(f)printf("Yes\n");
            else printf("No\n");
        }
    }
    return 0;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-12-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档