L3-016. 二叉搜索树的结构
二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉搜索树。(摘自百度百科)
给定一系列互不相等的整数,将它们顺次插入一棵初始为空的二叉搜索树,然后对结果树的结构进行描述。你需要能判断给定的描述是否正确。例如将{ 2 4 1 3 0 }插入后,得到一棵二叉搜索树,则陈述句如“2是树的根”、“1和4是兄弟结点”、“3和0在同一层上”(指自顶向下的深度相同)、“2是4的双亲结点”、“3是4的左孩子”都是正确的;而“4是2的左孩子”、“1和3是兄弟结点”都是不正确的。
输入格式:
输入在第一行给出一个正整数N(<= 100),随后一行给出N个互不相同的整数,数字间以空格分隔,要求将之顺次插入一棵初始为空的二叉搜索树。之后给出一个正整数M(<= 100),随后M行,每行给出一句待判断的陈述句。陈述句有以下6种:
- "A is the root",即"A是树的根";
- "A and B are siblings",即"A和B是兄弟结点";
- "A is the parent of B",即"A是B的双亲结点";
- "A is the left child of B",即"A是B的左孩子";
- "A is the right child of B",即"A是B的右孩子";
- "A and B are on the same level",即"A和B在同一层上"。
题目保证所有给定的整数都在整型范围内。
输出格式:
对每句陈述,如果正确则输出“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;
struct tree
{
tree *left, *right, *f;
int height,data;
}*root;
int n,d,k,a,b;
map<int,tree *> q;
map<int,int>o;
tree *creat(int d)
{
tree *p = new tree();
p->left = NULL;
p->right = NULL;
p->f = NULL;
p->height = ;
p->data = d;
q[d] = p;
o[d] = ;
return p;
}
void insert_(tree *root,tree *t)
{
if(t->data > root->data)
{
if(root -> right == NULL)root -> right = t,t -> f = root,t-> height = root -> height + ;
else insert_(root -> right,t);
}
else
{
if(root -> left == NULL)root -> left = t,t -> f = root,t-> height = root -> height + ;
else insert_(root -> left,t);
}
}
int main()
{
cin>>n;
if(n)
{
cin>>d;
root = creat(d);
}
for(int i = ;i < n;i ++)
{
cin>>d;
tree *p = creat(d);
insert_(root,p);
}
cin>>k;
for(int i = ;i < k;i ++)
{
cin>>a;
string op;
cin>>op;
if(op == "is")
{
cin>>op>>op;
if(op == "root")
{
if(o[a] && root == q[a])cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
else if(op == "parent")
{
cin>>op>>b;
if(o[a] && o[b] && q[b] -> f == q[a])cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
else if(op == "left")
{
cin>>op>>op>>b;
if(o[a] && o[b] && q[b] -> left == q[a])cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
else
{
cin>>op>>op>>b;
if(o[a] && o[b] && q[b] -> right == q[a])cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}
else
{
cin>>b>>op>>op;
if(op == "on")
{
cin>>op>>op>>op;
if(o[a] && o[b] && q[a] -> height == q[b] -> height)
{
cout<<"Yes"<<endl;
}
else cout<<"No"<<endl;
}
else
{
if(o[a] && o[b] && q[a] -> f == q[b] -> f)cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}
}
}
数组建树。
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <map>
using namespace std;
int pos;
struct BST {
int l,r,f,d,h;
BST() {
l = r = f = d = h = ;
}
}t[];
map<int,int> mp;
void Insert(int h,int no,int d) {
if(d < t[no].d) {
if(t[no].l) Insert(h + ,t[no].l,d);
else {
t[no].l = ++ pos;
t[pos].d = d;
t[pos].f = no;
t[pos].h = h + ;
}
}
else {
if(t[no].r) Insert(h + ,t[no].r,d);
else {
t[no].r = ++ pos;
t[pos].d = d;
t[pos].f = no;
t[pos].h = h + ;
}
}
}
int main() {
int n,d,m;
cin>>n;
cin>>d;
t[++ pos].d = d;
mp[d] = pos;
for(int i = ;i < n;i ++) {
cin>>d;
Insert(,,d);
mp[d] = pos;
}
cin>>m;
string s;
int a,b;
for(int i = ;i < m;i ++) {
cin>>a;
cin>>s;
bool flag = pos && mp[a] != ;
if(s == "is") {
cin>>s>>s;
if(s == "root") {
flag &= t[].d == a;
}
else if(s == "parent") {
cin>>s>>b;
flag &= mp[b] != && t[t[mp[b]].f].d == a;
}
else if(s == "left") {
cin>>s>>s>>b;
flag &= mp[b] != && t[t[mp[b]].l].d == a;
}
else {
cin>>s>>s>>b;
flag &= mp[b] != && t[t[mp[b]].r].d == a;
}
}
else {
cin>>b>>s>>s;
flag &= mp[b] != ;
if(s == "on") {
cin>>s>>s>>s;
flag &= t[mp[a]].h == t[mp[b]].h;
}
else {
flag &= t[mp[a]].f == t[mp[b]].f;
}
}
puts(flag ? "Yes" : "No");
}
}
L3-016. 二叉搜索树的结构的更多相关文章
- PTA 7-2 二叉搜索树的结构(30 分)
7-2 二叉搜索树的结构(30 分) 二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值:若它的右子树不空,则右子树上所有结点的值均大 ...
- 二叉搜索树的结构(30 分) PTA 模拟+字符串处理 二叉搜索树的节点插入和非递归遍历
二叉搜索树的结构(30 分) PTA 模拟+字符串处理 二叉搜索树的节点插入和非递归遍历 二叉搜索树的结构(30 分) 二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则 ...
- 二叉搜索树的结构(30 分) PTA 模拟+字符串处理 二叉搜索树的节点插入和非递归遍历
二叉搜索树的结构(30 分) 二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值:若它的右子树不空,则右子树上所有结点的值均大于它的根 ...
- 【开200数组解决二叉搜索树的建立、遍历】PAT-L3-016. 二叉搜索树的结构——不用链表来搞定二叉搜索树
L3-016. 二叉搜索树的结构 二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值:若它的右子树不空,则右子树上所有结点的值均大于它 ...
- PAT L3-016 二叉搜索树的结构
https://pintia.cn/problem-sets/994805046380707840/problems/994805047903240192 二叉搜索树或者是一棵空树,或者是具有下列性质 ...
- L3-1 二叉搜索树的结构 (30 分)
讲解的很不错的链接:https://blog.csdn.net/chudongfang2015/article/details/79446477#commentBox 题目链接:https://pin ...
- L3-016 二叉搜索树的结构 (30 分) 二叉树
二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值:若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值:它的左.右子树也分别 ...
- L3-016 二叉搜索树的结构 (30 分)
二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值:若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值:它的左.右子树也分别 ...
- 团体程序设计天梯赛 L3-016. 二叉搜索树的结构
#include <cstdio> #include <cstdlib> #include <string.h> #include <math.h> # ...
随机推荐
- linux cut sort wc sed>vi awk (文本处理)
cut: 显示切割的行数据 -f: 选择显示的列 (1: 显示第一列; 1,3: 显示第一列.第三列; 1-3: 显示第一列到第三列) -s: 不显示没有分隔符的行 -d: 自定义分隔符(' '空格 ...
- 深入浅出mysql笔记---0、序
深入浅出mysql笔记---0.序 一.总结 一句话总结: 心得:买书之前建议先找找电子书,纸质书太难带了 1.开源作用? 开源对mysql的发展至关重要 2.mysql在2002年就全面支持了事务, ...
- java应用cpu使用率过高问题排查
---------------------------------------linux下如何定位代码问题------------------------------- 1.先通过top命令找到消耗c ...
- jquery自动播放音频文件
使用jquery自动播放音频文件 <!DOCTYPE html> <html lang="en"> <head> <meta charse ...
- 2014过去了,正式步入职场了,.net
一.第一家公司(北京XXXXXXX) 从2014年7月1号拿到学位证,到7月15号到北京,努力找工作,用了两个多礼拜,终于找到了一个只有三个人的公司,愿意要我,薪资是实习三千,转正四千. 2014年7 ...
- 阶段3 1.Mybatis_06.使用Mybatis完成DAO层的开发_9 typeAliases标签和package标签
配置别名 上面制定了好了别名后,映射文件就可以简写了.不区分大小写 皆可以小写也可以大写 大小写混着也可以 测试 package 直接把com.itheima.domain下面所有的类都注册了 可以使 ...
- tensorflow运行原理分析(源码)
tensorflow运行原理分析(源码) https://pan.baidu.com/s/1GJzQg0QgS93rfsqtIMURSA
- TiDB配置HAProxy负载均衡
1.简介 HAProxy是一个C语言编写的免费的负载均衡软件,可以运行于大部分主流的Linux操作系统上. HAProxy提供了L4(TCP)和L7(HTTP)两种负载均衡能力,具备丰富的功能. 2. ...
- 机器学习实战-K-近邻算法(kNN)
k-近邻算法(kNN)---它的工作原理是:存在一个样本数据集合,也称做训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每个数据与所属分类的对应关系.输入没有标签的新数据后,将新数据的每 ...
- 【Linux开发】【Qt开发】交叉编译器 arm-linux-gnueabi 和 arm-linux-gnueabihf 的区别
一. 什么是ABI和EABI1) ABI: 二进制应用程序接口(Application Binary Interface (ABI) for the ARM Architecture)在计算机中,应用 ...