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\n");
            else
                printf("No\n");
            del(t2);
        }
        del(t1);
    }
    return 0;
}

posted @   洛沐辰  阅读(685)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示