PAT L3-016 二叉搜索树的结构

https://pintia.cn/problem-sets/994805046380707840/problems/994805047903240192

二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉搜索树。(摘自百度百科)

给定一系列互不相等的整数,将它们顺次插入一棵初始为空的二叉搜索树,然后对结果树的结构进行描述。你需要能判断给定的描述是否正确。例如将{ 2 4 1 3 0 }插入后,得到一棵二叉搜索树,则陈述句如“2是树的根”、“1和4是兄弟结点”、“3和0在同一层上”(指自顶向下的深度相同)、“2是4的双亲结点”、“3是4的左孩子”都是正确的;而“4是2的左孩子”、“1和3是兄弟结点”都是不正确的。

输入格式:

输入在第一行给出一个正整数N(≤),随后一行给出N个互不相同的整数,数字间以空格分隔,要求将之顺次插入一棵初始为空的二叉搜索树。之后给出一个正整数M(≤),随后M行,每行给出一句待判断的陈述句。陈述句有以下6种:

  • A is the root,即"A是树的根";
  • A and B are siblings,即"AB是兄弟结点";
  • A is the parent of B,即"AB的双亲结点";
  • A is the left child of B,即"AB的左孩子";
  • A is the right child of B,即"AB的右孩子";
  • A and B are on the same level,即"AB在同一层上"。

题目保证所有给定的整数都在整型范围内。

输出格式:

对每句陈述,如果正确则输出Yes,否则输出No,每句占一行。

输入样例:

5
2 4 1 3 0
8
2 is the root
1 and 4 are siblings
3 and 0 are on the same level
2 is the parent of 4
3 is the left child of 4
1 is the right child of 2
4 and 0 are on the same level
100 is the right child of 3

输出样例:

Yes
Yes
Yes
Yes
Yes
No
No
No

代码:

#include <bits/stdc++.h>
using namespace std;

int N, Q, root = 0;

struct Node{
    long long val;
    int l = -1;
    int r = -1;
    int fa = -1;
    int lev = 0;
}node[110];

map<long long, int> mp, vis;

void BuildBST(int root, int x) {
    if(node[root].val > node[x].val) {
        if(node[root].l == -1) {
            node[root].l = x;
            node[x].fa = root;
            node[x].lev = node[root].lev + 1;
        } else BuildBST(node[root].l, x);
    } else if(node[root].val <= node[x].val) {
        if(node[root].r == -1) {
            node[root].r = x;
            node[x].fa = root;
            node[x].lev = node[root].lev + 1;
        } else BuildBST(node[root].r, x);
    }
}

long long getnum(string s) {
    long long ans = 0;
    int len = s.length();
    bool flag = false;
    for(int i = 0; i < len; i ++) {
        if(s[i] == ‘-‘) {
            flag = true;
            break;
        }
    }
    for(int i = 0; i < len; i ++) {
        if(s[i] >= ‘0‘ && s[i] <= ‘9‘) {
            ans = ans * 10 + (s[i] - ‘0‘);
        }
    }

    if(flag) ans *= (-1);
    return ans;
}

int main() {
    scanf("%d", &N);
    for(int i = 0; i < N; i ++) {
        long long x;
        scanf("%lld", &x);
        node[i].val = x;
        vis[x] = 1;
        mp[x] = i;
    }

    for(int i = 1; i < N; i ++)
        BuildBST(root, i);

    scanf("%d", &Q);
    getchar();
    while(Q --) {
        long long num1, num2;
        scanf("%lld", &num1);
        string s;
        getline(cin, s);

        if(s.find("root") != -1) {
            if(num1 != node[root].val) printf("No\n");
            else printf("Yes\n");
        } else {
            num2 = getnum(s);
            if(vis[num1] == 0 || vis[num2] == 0) {
                printf("No\n");
                continue;
            }
            if(s.find("left") != -1) {
                if(mp[num1] == node[mp[num2]].l) printf("Yes\n");
                else printf("No\n");
            } else if(s.find("right") != -1) {
                if(mp[num1] == node[mp[num2]].r) printf("Yes\n");
                else printf("No\n");
            } else if(s.find("siblings") != -1) {
                if(node[mp[num1]].fa == node[mp[num2]].fa) printf("Yes\n");
                else printf("No\n");
            } else if(s.find("parent") != -1) {
                if(node[mp[num2]].fa == mp[num1]) printf("Yes\n");
                else printf("No\n");
            } else if(s.find("level") != -1) {
                if(node[mp[num1]].lev == node[mp[num2]].lev) printf("Yes\n");
                else printf("No\n");
            }
            //printf("%d\n", num2);
        }
    }

    return 0;
}

  

原文地址:https://www.cnblogs.com/zlrrrr/p/10624689.html

时间: 2024-10-10 16:56:37

PAT L3-016 二叉搜索树的结构的相关文章

PTA 7-2 二叉搜索树的结构(26 分)

这道题 错在了 交错树样例 , 少了4 分 ,谁知道什么原因的可以告诉我,感激不尽 7-2 二叉搜索树的结构(30 分) 二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值:若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值:它的左.右子树也分别为二叉搜索树.(摘自百度百科) 给定一系列互不相等的整数,将它们顺次插入一棵初始为空的二叉搜索树,然后对结果树的结构进行描述.你需要能判断给定的描述是否正确.例如将{ 2 4 1

L3-016 二叉搜索树的结构

按要求判断树的信息,考查对字符串的处理~ #include<bits/stdc++.h> using namespace std; const int maxn=1014; struct node { int data; node * left; node * right; }; void insert (node * &root,int v) { if (root==NULL) { root=new node; root->data=v; root->left=NULL;

二叉搜索树(Binary Search Tree)

1.什么是二叉搜索树 二叉搜索树(Binary Search Tree)是一棵有序的二叉树,所以我们也可以称它为二叉排序树(不知道二叉树的童鞋,先看看二叉树:传送门).具有以下性质的二叉树我们称之为二叉搜索树:若它的左子树不为空,那么左子树上的所有值均小于它的根节点:若它的右子树不为空,那么右子树上所有值均大于它的根节点.它的左子树和右子树分别也为二叉搜索树. 2.二叉搜索树的结构 二叉搜索树能够高效的进行一下操作:①插入一个数值②查询是否包含某个数值③删除某个数值 根据实现的不同,还可以实现其

二叉搜索树JAVA实现

引入: 二叉搜索树是这样的一种二叉树: (1)每个元素都有一个关键值,并且没有任意两个元素有相同的关键值 (2)根节点的左子树中任意元素的关键值小于根节点的关键值. (3)根节点的右子树中任意元素的关键值大于根节点的关键值. (4)根节点的左右子树也是二叉搜索树. 我们这里就用程序来实现这样一颗二叉搜索树. 分析: 从定义看出,二叉搜索树是一种特殊的二叉树,它给每个元素加上了序的概念,但又不同于最大最小堆,它总是 左<根<右的.我们分别看常用的几个操作. 查找: 关键值查找很简单,就是从根元素

每日刷题191130 --基础知识篇 二叉搜索树

休息了两天,状态恢复了一下,补充点基础知识. 二叉搜索树 搜索树数据结构支持许多动态集合操作,包括Search,minimum,maximum,predecessor(前驱),successor(后继),INSERT和DELETE等.因此我们使用一颗搜索树既可以作为一个字典又可以作为一个优先队列.且二叉搜索树上的基本操作所花费的时间与这棵树的高度成正比.二叉搜索树有两个很重要的变体,红黑树与B树,这个我们之后有机会再补一篇文章. 顾名思义,一棵二叉搜索树是以一棵二叉树来组织的.如图所示,这样的一

【数据结构】树与树的表示、二叉树存储结构及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树与哈夫曼编码、集合及其运算

1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R 中找出关键字与K 相同的记录).一个自然的问题就是,如何实现有效率的查找? 静态查找:集合中记录是固定的,没有插入和删除操作,只有查找 动态查找:集合中记录是动态变化的,除查找,还可能发生插入和删除 静态查找--方法一:顺序查找(时间复杂度O(n)) int SequentialSearch(St

数据结构(三):非线性逻辑结构-特殊的二叉树结构:堆、哈夫曼树、二叉搜索树、平衡二叉搜索树、红黑树、线索二叉树

在上一篇数据结构的博文<数据结构(三):非线性逻辑结构-二叉树>中已经对二叉树的概念.遍历等基本的概念和操作进行了介绍.本篇博文主要介绍几个特殊的二叉树,堆.哈夫曼树.二叉搜索树.平衡二叉搜索树.红黑树.线索二叉树,它们在解决实际问题中有着非常重要的应用.本文主要从概念和一些基本操作上进行分类和总结. 一.概念总揽 (1) 堆 堆(heap order)是一种特殊的表,如果将它看做是一颗完全二叉树的层次序列,那么它具有如下的性质:每个节点的值都不大于其孩子的值,或每个节点的值都不小于其孩子的值

PAT L2-004. 这是二叉搜索树吗?

题目链接:PAT L2-004. 这是二叉搜索树吗? 题意: 给你一串数,问你是否是一个二叉搜索树或者是镜像的先序遍历. 如果是,就输出这棵树的后序遍历. 题解: 根据二叉搜索树的性质,模拟判断一下. 1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=a;i<=b;++i) 3 using namespace std; 4 5 const int N=1e4+7; 6 7 int n,ismirror; 8 vector<

PAT天梯赛练习题 L3-010. 是否完全二叉搜索树(完全二叉树的判断)

L3-010. 是否完全二叉搜索树 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果. 输入格式: 输入第一行给出一个不超过20的正整数N:第二行给出N个互不相同的正整数,其间以空格分隔. 输出格式: 将输入的N个正整数顺序插入一个初始为空的二叉搜索树.在第一行中输出结果树的层序