天梯赛练习 L3-016 二叉搜索树的结构 (30分)
题目分析:
用数型结构先建树,一边输入一边建立,根节点的下标为1,所以左孩子为root*2,右孩子为root*2+1,输入的时候可用cin输入字符串也可用scanf不会超时,判断是否在同一层可以判断两个节点位置以2为底的对数向下取整是否相同得知(log(m)/log(2)为以换底公式实现的求以2为底m的对数)
坑点:
查询的整数可能并不出现在建立的树中(第三个测试数据)
本题代码:(菜)
1 #include<iostream>
2 #include<stdio.h>
3 #include<string>
4 #include<string.h>
5 #include<algorithm>
6 #include<map>
7 #include<cmath>
8 using namespace std;
9
10 const int N = 10005;
11 int vis[N];
12 int tree[N];
13 map<int, int> mp;
14 int n, m;
15
16 void create(int root, int value){
17 if(vis[root] == 0){
18 vis[root] = 1;
19 tree[root] = value;
20 mp[value] = root; //记录每个value在那个点
21 return;
22 }else{
23 if(value < tree[root]) create(root*2, value);
24 else create(root*2+1, value);
25 }
26 }
27
28 bool judge(int x){
29 if(mp.find(x) == mp.end()){
30 printf("No\n");
31 return false;
32 }
33 return true;
34 }
35
36 void isgen(int x){
37 if(!judge(x)) return;
38 if(tree[1] == x) printf("Yes\n");
39 else printf("No\n");
40 }
41
42 void iscen(int x, int y){
43 if(!judge(x) || !judge(y)) return;
44 x = mp[x]; y = mp[y];
45 if(int(log(x)/log(2)) == int(log(y)/log(2))) printf("Yes\n");
46 else printf("No\n");
47 }
48
49 void isleft(int x, int y){
50 if(!judge(x) || !judge(y)) return;
51 if(mp[y]*2 == mp[x]) printf("Yes\n");
52 else printf("No\n");
53 }
54
55 void isright(int x, int y){
56 if(!judge(x) || !judge(y)) return;
57 if(mp[y]*2+1 == mp[x]) printf("Yes\n");
58 else printf("No\n");
59 }
60
61 void isborther(int x, int y){
62 if(!judge(x) || !judge(y)) return;
63 if(mp[x]/2 == mp[y]/2) printf("Yes\n");
64 else printf("No\n");
65 }
66
67 void isparent(int x, int y){
68 if(!judge(x) || !judge(y)) return;
69 if(mp[y]/2 == mp[x]) printf("Yes\n");
70 else printf("No\n");
71 }
72
73 int main(){
74 scanf("%d", &n);
75 memset(vis, 0, sizeof(vis));
76 for(int i = 1; i <= n; i++){
77 int x; scanf("%d", &x);
78 create(1, x);
79 }
80 scanf("%d", &m);
81 for(int i = 1; i <= m; i++){
82 int x;
83 cin>>x;
84 string s1; cin>>s1;
85 if(s1 == "and"){
86 int y; cin>>y;
87 cin>>s1; cin>>s1;
88 if(s1 == "on"){ //判断是否是同层
89 getline(cin, s1);
90 iscen(x, y);
91 }else{ //判断是否是兄弟
92 getline(cin, s1);
93 isborther(x, y);
94 }
95 }else{
96 cin>>s1; cin>>s1;
97 if(s1 == "root"){//是否为根
98 isgen(x);
99 }else if(s1 == "parent"){//x是否是y的父亲
100 cin>>s1;
101 int y; cin>>y;
102 isparent(x, y);
103 }else if(s1 == "left"){//x是否是y的左孩子
104 cin>>s1; cin>>s1;
105 int y; cin>>y;
106 isleft(x, y);
107 }else{ //x是否是y的右孩子
108 cin>>s1; cin>>s1;
109 int y; cin>>y;
110 isright(x, y);
111 }
112 }
113 }
114 return 0;
115 }
天梯赛练习 L3-016 二叉搜索树的结构 (30分)的更多相关文章
- PAT 天梯赛 L2-004 这是二叉搜索树吗?
递归判断+建树 题目链接:https://www.patest.cn/contests/gplt/L2-004 题解 二叉搜索树的特点就是其根节点的值是位于左右子树之间的,即大于左子树的所有值,但是小 ...
- PAT天梯赛L2-004 这是二叉搜索树吗【递归】
L2-004. 这是二叉搜索树吗? 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 一棵二叉搜索树可被递归地定义为具有下列性质的 ...
- PAT 天梯赛 是否同一棵二叉搜索树 (25分)(二叉搜索树 指针)
给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到.例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果 ...
- 团体程序设计天梯赛L3-010 是否完全二叉搜索树 2017-03-24 16:12 29人阅读 评论(0) 收藏
L3-010. 是否完全二叉搜索树 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 将一系列给定数字顺序插入一个初始为空的二叉搜 ...
- pat 团体天梯赛 L3-010. 是否完全二叉搜索树
L3-010. 是否完全二叉搜索树 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 将一系列给定数字顺序插入一个初始为空的二叉搜 ...
- pat 团体天梯赛 L2-004. 这是二叉搜索树吗?
L2-004. 这是二叉搜索树吗? 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 一棵二叉搜索树可被递归地定义为具有下列性质的 ...
- PAT 天梯赛 L3-010. 是否完全二叉搜索树 【Tree】
题目链接 https://www.patest.cn/contests/gplt/L3-010 思路 因为是 完全二叉搜索树 可以用 数据 建树的方式 然后 遍历一遍这个 数字 就是 层序遍历 遍历的 ...
- 【二叉搜索树】PAT-天梯赛- L2-004. 这是二叉搜索树吗?
大致题意: 一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点, 其左子树中所有结点的键值小于该结点的键值: 其右子树中所有结点的键值大于等于该结点的键值: 其左右子树 ...
- PTA 7-2 二叉搜索树的结构(30 分)
7-2 二叉搜索树的结构(30 分) 二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值:若它的右子树不空,则右子树上所有结点的值均大 ...
随机推荐
- Codeforces Edu Round 56 A-D
A. Dice Rolling 把\(x\)分解为\(a * 6 + b\),其中\(a\)是满6数,\(b\)满足\(1 <= b < 6\),即可... #include <io ...
- 面试官:小伙子,你给我简单说一下RocketMQ 整合 Spring Boot吧
前言 在使用SpringBoot的starter集成包时,要特别注意版本.因为SpringBoot集成RocketMQ的starter依赖是由Spring社区提供的,目前正在快速迭代的过程当中,不同版 ...
- tensorflow学习笔记——DenseNet
完整代码及其数据,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/DeepLearningNote 这里结合网络的资料和De ...
- pandas的学习6-合并concat
import pandas as pd import numpy as np ''' pandas处理多组数据的时候往往会要用到数据的合并处理,使用 concat是一种基本的合并方式. 而且conca ...
- ctf/web源码泄露及利用办法
和上一篇文章差不多,也算是对web源码泄露的一个总结,但是这篇文章更侧重于CTF 参考文章: https://blog.csdn.net/wy_97/article/details/78165051? ...
- win10新版wsl2使用指南
本篇文章会介绍win10中wsl2的安装和使用以及遇到的常见问题比如如何固定wsl2地址等问题的总结. 一.wsl2简介 wsl是适用于 Linux 的 Windows 子系统,安装指南:适用于 Li ...
- python初学者-从键盘获取信息
name = input(">>> 姓名:") QQ = input(">>>QQ: ") phone_num = inpu ...
- JVM 经典垃圾收集器 —— CMS 收集器
本文部分摘自<深入理解 Java 虚拟机第三版> 概述 CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器.由于大部分 Java 应用主要 ...
- 在.NET Core 中收集数据的几种方式
APM是一种应用性能监控工具,可以帮助理解系统行为, 用于分析性能问题的工具,以便发生故障的时候,能够快速定位和解决问题, 通过汇聚业务系统各处理环节的实时数据,分析业务系统各事务处理的交易路径和处理 ...
- easyui获取table列表中所有数据组装成json格式发送到后台
jsp代码 var rows =$('#findAllRolestable').datagrid('getSelections'); var result = JSON.stringify(rows) ...