zoukankan      html  css  js  c++  java
  • 数据结构实验之查找一:二叉排序树 (SDUT 3373)

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

    #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
    ");
                else printf("No
    ");
            }
        }
        return 0;
    }
    
    
    
    

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


    #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
    ");
                else printf("No
    ");
            }
        }
        return 0;
    }
    
  • 相关阅读:
    【.net】从比较两个字节数组谈起
    不靠谱招聘信息大围观 第一季
    微软社区大课堂招募学生
    [WPF]带下拉列表的文本框
    SVN: is scheduled for addition, but is missing
    bootstrap模态框手动开启关闭与设置点击外部不关闭
    PHP实现各种经典算法
    使用vue如何默认选中单选框
    vue使用resource传参数
    视频处理工具FFmpeg的安装(windows/Linux)
  • 原文地址:https://www.cnblogs.com/lcchy/p/10139410.html
Copyright © 2011-2022 走看看