nyoj 1278G: Prototypes analyze 与 二叉排序树(BST)模板

参考博客:https://blog.csdn.net/stpeace/article/details/9067029
参考博客:https://blog.csdn.net/baidu_35643793/article/details/70792326

先放上二叉搜索树的板子

#include <iostream>
using namespace std;

// BST的结点
typedef struct node
{
    int key;
    struct node *lChild, *rChild;
}Node, *BST;

// 在给定的BST中插入结点,其数据域为element, 使之称为新的BST
bool BSTInsert(Node * &p, int element)
{
    if(NULL == p) // 空树
    {
        p = new Node;
        p->key = element;
        p->lChild = p->rChild = NULL;
        return true;
    }

    if(element == p->key) // BST中不能有相等的值
        return false;

    if(element < p->key)  // 递归
        return BSTInsert(p->lChild, element);

    return BSTInsert(p->rChild, element); // 递归
}

// 建立BST
void createBST(Node * &T, int a[], int n)
{
    T = NULL;
    int i;
    for(i = 0; i < n; i++)
    {
        BSTInsert(T, a[i]);
    }
}

// 先序遍历
void preOrderTraverse(BST T)
{
    if(T)
    {
        cout << T->key << " ";
        preOrderTraverse(T->lChild);
        preOrderTraverse(T->rChild);
    }
}

// 中序遍历
void inOrderTraverse(BST T)
{
    if(T)
    {
        inOrderTraverse(T->lChild);
        cout << T->key << " ";
        inOrderTraverse(T->rChild);
    }
}

int main()
{
    int a[10] = {4, 5, 2, 1, 0, 9, 3, 7, 6, 8};
    int n = 10;
    BST T;

    // 并非所有的a[]都能构造出BST,所以,最好对createBST的返回值进行判断
    createBST(T, a, n);

    preOrderTraverse(T);
    cout << endl;

    inOrderTraverse(T);
    cout << endl;

    return 0;
}

nyoj 1278

这道题 题意就是 判断二叉排序树的形状有多少个不一样。
首先 建树 就用上面的板子。
然后就是 判断形状:只需要各个位置是否对应一致有值就行了(如果一颗树在这个地方是空的,那么另一颗树要想与它形状相同,这个地方也必须是空的)

//BST二叉搜索树;
#include<cstdio>
#include<iostream>
using namespace std;

int flag;

typedef struct Node
{
    int key;
    struct Node *lChild,*rChild;
} Node,*BST;

bool BSTInsert(Node * &p,int element)
{
    if(p==NULL)
    {
        p=new Node;
        p->key=element;
        p->lChild=p->rChild=NULL;
        return true;
    }
    if(element==p->key)
        return false;
    if(element<p->key)
        return BSTInsert(p->lChild,element);
    return BSTInsert(p->rChild,element);
}

void judge(BST T1,BST T2)  //判断形状;
{
    if(T1==NULL&&T2==NULL)
        return;
    else if(T1&&T2)
    {
        judge(T1->lChild,T2->lChild);
        judge(T1->rChild,T2->rChild);
    }
    else
        flag=0;
}

int main()
{
    int t,n,k,x;
    BST tree[55];

    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&k);
        for(int i=0; i<n; i++)
        {
            BST T=NULL;
            for(int j=0; j<k; j++)  //建树;
            {
                scanf("%d",&x);
                BSTInsert(T,x);
            }
            tree[i]=T;
        }

        //找形状种类数;
        int ans=0;
        for(int i=0; i<n; i++)
        {
            int flog=1;
            for(int j=i+1; j<n; j++)
            {
                flag=1;
                judge(tree[i],tree[j]);
                if(flag)
                {
                    flog=0;
                    break;
                }
            }
            if(flog)
                ++ans;
        }
        printf("%d\n",ans);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/fisherss/p/10801215.html

时间: 2024-11-10 18:02:15

nyoj 1278G: Prototypes analyze 与 二叉排序树(BST)模板的相关文章

Prototypes analyze(二叉排序树,不同树形个数)

Prototypes analyze 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 ALpha Ceiling Manufacturers (ACM) is analyzing the properties of its new series of Incredibly Collapse-Proof Ceilings (ICPCs). An ICPC consists of n layers of material, each with a different v

二叉排序树(BST)

二叉排序树: 二叉排序树(Binary Sort Tree)又称二叉查找树(Binary Search Tree),亦称二叉搜索树. 它或者是一棵空树:或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值: (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值: (3)左.右子树也分别为二叉排序树: 注:中序遍历一棵二叉排序树会得到一个有序序列. 考虑序列5,3,7,2,4,8,对应的二叉排序树构造过程如下: 实现: /*************

STL源码笔记(17)—二叉排序树BST(C++封装)

二叉排序树BST STL中还有一类非常重要的容器,就是关联容器,比如map啊set啊等等,这些容器说实话,在应用层上还不能完全得心应手(比如几种容器效率的考虑等等),更别说源码了,因此这一部分打算稳扎稳打,好好做做笔记研究一番. 说到关联容器,我们想到了什么AVL树,红黑树等等,但大多时候我们仅仅局限于知道其名字,或者知道其概念,俗话说"talk is cheap,show me the code",因此,我打算从他们的祖爷爷二叉排序树开始下手.(其实,侯老师的书上也是这么安排的哈)

二叉查找树BST 模板

二叉查找树BST 就是二叉搜索树 二叉排序树. 就是满足 左儿子<父节点<右儿子 的一颗树,插入和查询复杂度最好情况都是logN的,写起来很简单. 根据BST的性质可以很好的解决这些东西 1.查询值 int Search(int k,int x) { if(x<a[k].key && a[k].l) Search(a[k].l,x); else if(x>a[k].key && a[k].r) Search(a[k].r,x); else retur

哈夫曼树;二叉树;二叉排序树(BST)

优先队列:priority_queue<Type, Container, Functional>Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式.Container 必须是用数组实现的容器,比如 vector, deque 但不能用 list.STL里面默认用的是 vector. 比较方式默认用 operator< , 所以如果你把后面俩个参数缺省的话,优先队列就是大顶堆,队头元素最大. 而在求哈夫曼树中,我们恰恰需要取得堆中最小的元素,

查找算法系列之复杂算法:二叉排序树BST

前面总结了顺序查找,二分查找,分块查找算法,此篇博文将详解介绍二叉排序算法(Binary Sort Tree). 在介绍二叉排序算法之前,首先介绍什么事二叉排序树(BST). 首先从二叉树讲起: 1.二叉树的概念 二叉树是每个结点最多有两个子树的有序树.通常子树的根被称作"左子树"(leftsubtree)和"右子树"(rightsubtree).二叉树常被用作二叉查找树和二叉堆或是二叉排序树.二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有

二叉排序树(BST)的思路及C语言实现

请注意,为了能够更好的理解二叉排序树,我建议各位在看代码时能够设置好断点一步一步跟踪函数的运行过程以及各个变量的变化情况 一.动态查找所面临的问题 在进行动态查找操作时,如果我们是在一个无序的线性表中进行查找,在插入时可以将其插入表尾,表长加1即可:删除时,可以将待删除元素与表尾元素做个交换,表长减1即可.反正是无序的,当然是怎么高效怎么操作.但如果是有序的呢?回想学习线性表顺序存储时介绍的顺序表的缺点,就在于插入删除操作的复杂与低效. 正因为如此,我们引入了链式存储结构,似乎这样就能解决上面遇

【数据结构】简单谈一谈二分法和二叉排序树BST查找的比较

二分法查找: 『在有序数组的基础上通过折半方法不断缩小查找范围,直至命中或者查询失败.』 二分法的存储要求:要求顺序存储,以便于根据下标随机访问 二分法的时间效率:O(Log(n)) 二分法的空间效率:原地查询 O(1) 二分法对应的搜索树是确定的. 二叉排序树查找: 『借助二叉排序树进行搜索,但因为所建立的树本身不一定是轴对称的,所以每次比较并不能确保减小一半范围.』 二叉树的存储要求:需要树形结构,相比顺序存储需要占用更多的空间,但也有链接型数据结构灵活可拓展的有点. 二叉排序树查找的时间复

NYOJ 1085 数单词 (AC自动机模板题)

数单词 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 为了能够顺利通过英语四六级考试,现在大家每天早上都会早起读英语. LYH本来以为自己在6月份的考试中可以通过六级,可是没想到,成绩出来以后,居然没有通过.所以他不得不付出更多的时间来学习英语. 要想通过六级,最基本的要求就是词汇量.为了能够更快的记住一些陌生单词,LYH有时会找一些英语文章来读. 今天早上,LYH又找了一篇文章.读之前,他突然萌生出一个想法:文章中哪些单词出现的次数最多呢? 输入 第一行输入一个