zoukankan      html  css  js  c++  java
  • 树4 是否同一棵二叉搜索树

    题目:https://pintia.cn/problem-sets/1268384564738605056/problems/1276814005115539456

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

    输入格式:

    输入包含若干组测试数据。每组数据的第1行给出两个正整数N (10)和L,分别是每个序列插入元素的个数和需要检查的序列个数。第2行给出N个以空格分隔的正整数,作为初始插入序列。最后L行,每行给出N个插入的元素,属于L个需要检查的序列。

    简单起见,我们保证每个插入序列都是1到N的一个排列。当读到N为0时,标志输入结束,这组数据不要处理。

    输出格式:

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

    输入样例:

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

    输出样例:

    Yes
    No
    No
    
     

    鸣谢青岛大学周强老师补充测试数据!

     
    题解:https://blog.csdn.net/vocaloid01/article/details/78502962
    代码:

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct Node* node;
    
    struct Node
    {
        int Data;
        node Left;
        node Right;
        int Key;
    };
    
    node Insert(node root,int data)
    {
        node re = root;
        node p = (node)malloc(sizeof(struct Node));
        p->Data = data;
        p->Left = NULL;
        p->Right = NULL;
        p->Key = 0;
        if(root == NULL)
        {
            root = p;
            return root;
        }
        else
        {
            while(root)
            {
                if(root->Data > data && root->Left)
                {
                    root = root->Left;
                }
                else if(root->Data < data && root->Right)root = root->Right;
                else break;
            }
            if(root->Data > data)root->Left = p;
            else root->Right = p;
        }
        return re;
    }
    
    int Search(node root,int data)
    {
        while(root && root->Data!=data)
        {
            if(root->Key == 0)return 1;
            if(root->Data>data)root = root->Left;
            else root = root->Right;
        }
        root->Key = 1;
        return 0;
    }
    
    void Ini(node root)
    {
        if(root == NULL)return ;
        if(root->Key)root->Key = 0;
        Ini(root->Left);
        Ini(root->Right);
    }
    
    int board[15];
    
    int main()
    {
        int N,L;
        while(scanf("%d",&N) && N)
        {
            scanf("%d",&L);
            node root = NULL;
            for(int i=0 ; i<N ; i++)
            {
                int mid;
                scanf("%d",&mid);
                root = Insert(root,mid);
            }
    
            while(L--)
            {
                int i;
                for(i=0 ; i<N ; i++)scanf("%d",&board[i]);
                for(i=0  ; i<N ; i++)
                {
                    if(Search(root,board[i]))break;
                }
                Ini(root);
                if(i == N)printf("Yes
    ");
                else printf("No
    ");
            }
        }
    
        return 0;
    }
  • 相关阅读:
    微信WeixinJSBridge API
    微信内置浏览器的JsAPI(WeixinJSBridge续)[转载]
    一套简单可依赖的Javascript库
    一款轻量级移动web开发框架
    传说中的WeixinJSBridge和微信rest接口
    点击网页分享按钮,触发微信分享功能
    Metronic前端模板
    AdminLTE前端模板
    Nginx如何配置静态文件直接访问
    架构设计流程
  • 原文地址:https://www.cnblogs.com/simon-chou/p/13619909.html
Copyright © 2011-2022 走看看