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

    提示:本题考查二叉排序树的特点:根节点总是大于它的左子树,小于它的右子树,所以只需只需构造两棵二叉排序树进行比较即可。

    代码实现如下(g++):
    #include <bits/stdc++.h>
    
    using namespace std;
    
    typedef struct node
    {
        int data;
        struct node *left,*right;
    } node,*Tree;
    
    void create(Tree &root,int ch)//建立二叉排序树
    {
        if(root==NULL)
        {
            root=new node;
            root->left=NULL;
            root->right=NULL;
            root->data=ch;
        }
        else
        {
            if(ch<root->data)
            {
                create(root->left,ch);
            }
            else
                create(root->right,ch);
        }
    }
    
    int Judge(Tree &root1,Tree &root2)//进行两棵树的判断
    {
        if(root1==NULL&&root2==NULL)//如果都空,相同
        {
            return 1;
        }
        else if(root1!=NULL&&root2!=NULL)
        {
            if(root1->data!=root2->data)//如果数据不相同
            {
                return 0;
            }
            else if(Judge(root1->left,root2->left)&&Judge(root1->right,root2->right))//遍历左子树和右子树发现都相同
            {
                return 1;
            }
            else
                return 0;
        }
        else
            return 0;
    }
    
    int main()
    {
        int n,l,i,ch;
        Tree root1,root2;
        while(~scanf("%d",&n)&&n)
        {
            scanf("%d",&l);
            root1=NULL;
            for(i=0;i<n;i++)
            {
                scanf("%d",&ch);
                create(root1,ch);
            }
            while(l--)
            {
                root2=NULL;
                for(i=0;i<n;i++)
                {
                    scanf("%d",&ch);
                    create(root2,ch);
                }
                int t=Judge(root1,root2);
                if(t==1)
                {
                    printf("Yes
    ");
                }
                else
                    printf("No
    ");
            }
        }
        return 0;
    }
    
    
    /***************************************************
    Result: Accepted
    Take time: 0ms
    Take Memory: 200KB
    ****************************************************/
  • 相关阅读:
    代码301的弊端和处理方法
    seo如何发外链
    seo工程师是什么,需要什么技能?
    优化一个关键词到百度首页需要多少钱
    搜索引擎优化顾问机构好不好
    谷歌分析(GA)新版的有哪些改变
    什么是相关性链接/网站相关性
    JS的部分部分疑问和小结
    Groovy学习:第一章 用Groovy简化Java代码
    SpringMVC学习(8):国际化
  • 原文地址:https://www.cnblogs.com/jkxsz2333/p/9511218.html
Copyright © 2011-2022 走看看