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

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

    Time Limit: 400 ms Memory Limit: 65536 KiB

    Problem Description

    对应给定的一个序列可以唯一确定一棵二叉排序树。然而,一棵给定的二叉排序树却可以由多种不同的序列得到。例如分别按照序列{3,1,4}和{3,4,1}插入初始为空的二叉排序树,都得到一样的结果。你的任务书对于输入的各种序列,判断它们是否能生成一样的二叉排序树。

    Input

    输入包含若干组测试数据。每组数据的第1行给出两个正整数N (n < = 10)和L,分别是输入序列的元素个数和需要比较的序列个数。第2行给出N个以空格分隔的正整数,作为初始插入序列生成一颗二叉排序树。随后L行,每行给出N个元素,属于L个需要检查的序列。
    简单起见,我们保证每个插入序列都是1到N的一个排列。当读到N为0时,标志输入结束,这组数据不要处理。

    Output

    对每一组需要检查的序列,如果其生成的二叉排序树跟初始序列生成的二叉排序树一样,则输出"Yes",否则输出"No"。

    Sample Input

    4 2
    3 1 4 2
    3 4 1 2
    3 2 4 1
    2 1
    2 1
    1 2
    0

    Sample Output

    Yes
    No
    No

    题解:简单的二叉排序树建立与比较,首先建立成第一棵树,根据输入建立第二棵树,然后比较就可以。
    所谓的二叉排序树,就是他的先序遍历是按照顺序排列的。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct node  //存储树的节点
    {
        struct node *l,*r;
        int data;
    }node;
    
    node *newNode()  //开辟新的节点
    {
        node *t;
        t = (node *)malloc(sizeof(node));
        t->l = t->r = NULL;
        return t;
    }
    
    node *build(node *t,int x)  //根据顺序建立二叉排序树
    {
        if(t==NULL)
        {
            t = newNode();
            t->data = x;
            return t;
        }
        if(x>t->data)
        {
            t->r = build(t->r,x);
            return t;
        }
        else
        {
            t->l = build(t->l,x);
            return t;
        }
    }
    
    int judge(node *t1,node *t2) //判断两棵树是否相等
    {
        if(t1==NULL||t2==NULL)
        {
            if(t1==NULL&&t2==NULL)
                return 1;
            else
                return 0;
        }
        if(t1->data==t2->data&&judge(t1->l,t2->l)&&judge(t1->r,t2->r))
            return 1;
        return 0;
    }
    
    void show(node *t)
    {
        if(t)
        {
            printf("%d",t->data);
            show(t->l);
            show(t->r);
        }
    }
    
    void del(node *t)
    {
        if(t)
        {
            del(t->l);
            del(t->r);
            free(t);
        }
    }
    
    int main()
    {
        node *t1,*t2;
        int m,n,i,x;
        while(scanf("%d",&n)!=EOF&&n)
        {
            scanf("%d",&m);
            t1 = NULL;
            for(i=0;i<n;i++)
            {
                scanf("%d",&x);
                t1 = build(t1,x);
            }
            while(m--)
            {
                t2 = NULL;
                for(i=0;i<n;i++)
                {
                    scanf("%d",&x);
                    t2 = build(t2,x);
                }
                if(judge(t1,t2))
                    printf("Yes
    ");
                else
                    printf("No
    ");
                del(t2);
            }
            del(t1);
        }
        return 0;
    }
    
    
  • 相关阅读:
    利用window.onerror收集js代码异常
    js 基础题复习
    正则12和\1的理解
    CodeReview 方法 规范
    前端的登陆 几种类型
    http协议相关知识
    javascript中apply、call和bind的区别 详细易懂
    http常见的状态码,400,401,403 前端看
    vue中使用file-saver 下载各类文件
    js下载文件到本地各种方法总结
  • 原文地址:https://www.cnblogs.com/luoxiaoyi/p/10134025.html
Copyright © 2011-2022 走看看