zoukankan      html  css  js  c++  java
  • 04-树4 是否同一棵二叉搜索树 (25 分)

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

    输入格式:

    输入包含若干组测试数据。每组数据的第1行给出两个正整数N (≤)和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
    #include<stdio.h>
    #include<stdlib.h>
    
    typedef struct TreeNode* Tree;
    struct TreeNode
    {
        int v;
        Tree left,right;
        int flag;
    };
    
    Tree makeTree(int n);
    Tree newNode(int v);
    Tree Insert(Tree T, int v);
    bool Judge(Tree T,int n);
    bool check(Tree T,int v);
    void Reset(Tree T);
    void FreeTree(Tree T);
    
    int main()
    {
        int n,l;
        Tree T;
        scanf("%d",&n);
        while(n)
        {
            scanf("%d",&l);
            T = makeTree(n);
            for (int i = 0; i < l; i++)
            {
                if (Judge(T,n))
                {
                    printf("Yes
    ");
                }
                else
                {
                    printf("No
    ");
                }
                Reset(T);
            }
            FreeTree(T);
            scanf("%d",&n);
        }
        return 0;
    }
    
    Tree makeTree(int n)
    {
        int v;
        scanf("%d",&v);
        
        Tree T = newNode(v);
        for (int i = 1; i < n; i++)
        {
            scanf("%d",&v);
            T = Insert(T,v);
        }
        return T;
    }
    
    Tree newNode(int v)
    {
        Tree T = (Tree)malloc(sizeof(struct TreeNode));
        T->v = v;
        T->left = T->right = NULL;
        T->flag = 0;
        return T;
    }
    
    Tree Insert(Tree T, int v)
    {
        if (!T)
        {
            T = newNode(v);
        }
        else
        {
            if (v > T->v)
            {
                T->right = Insert(T->right,v);
            }
            else
            {
                T->left = Insert(T->left,v);
            }
        }
        return T;
    }
    
    /* 
    flag为True表示两颗二叉搜索树相同
    T->Flag = 1 表示该点相同并且已经对比过 
    */
    bool Judge(Tree T,int n)
    {
        bool flag = true;
        int v;
        scanf("%d",&v);
        
        if (v != T->v)
        {
            flag = false;
        }
        else
        {
            T->flag = 1; 
        }
        
        for (int i = 1; i < n; i++)
        {
            scanf("%d",&v);
            if ( (flag) && (!check(T,v)))
            {
                flag = false;
            }
        }
        
        return flag;
    }
    
    /*
    如果该点已经对比过且结果是相同的,进入子树
    否则就该点与v比较,相同返回True,不同返回false 
    */
    bool check(Tree T,int v)
    {
        if (T->flag)
        {
            if (v > T->v)
            {
                return check(T->right,v);
            }
            else if (v < T->v)
            {
                return check(T->left,v);
            }
            else
            {
                return true;
            }
        }
        else
        {
            if ( v == T->v)
            {
                T->flag = 1;
                return true;
            }
            else
            {
                return false;
            }
        }
    }
    
    void Reset(Tree T)
    {
        if (T->left)
        {
            Reset(T->left);
        }
        if (T->right)
        {
            Reset(T->right);
        }
        T->flag = 0;
    }
    
    void FreeTree(Tree T)
    {
        if (T->left)
        {
            FreeTree(T->left);
        }
        if (T->right)
        {
            FreeTree(T->right);
        }
        free(T);    
    }
  • 相关阅读:
    HDU 2852 KiKi's K-Number (主席树)
    HDU 2089 不要62
    Light oj 1140 How Many Zeroes?
    Bless You Autocorrect!
    HDU 6201 transaction transaction transaction
    HDU1561 The more ,The better (树形背包Dp)
    CodeForces 607B zuma
    POJ 1651 Mulitiplication Puzzle
    CSUOJ 1952 合并石子
    Uva 1599 Ideal path
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/11748755.html
Copyright © 2011-2022 走看看