团体程序设计天梯赛-练习集 -- L3-016. 二叉搜索树的结构(模拟)
来源:互联网 发布:手机淘宝兼职是真的吗 编辑:程序博客网 时间:2024/04/30 17:55
题意:
建立搜索二叉树,然后就是一系列询问了。
有几个坑:
要查询的数值可能不在二叉树上。
数值不是1~n的。需要以下标建立二叉树或者 离散化一下。
可能是时间紧迫问题, 差了四分 就是没想到 数值可能不在二叉树上了。
#include <cstdio>#include <cstring>#include <algorithm>#include <string>#include <iostream>#include <unordered_map>using namespace std;const int maxn = 100 + 10;unordered_map<int,int>mp;int a[maxn];int lch[maxn], rch[maxn],dep[maxn];int fa[maxn];int cnt = 1;int root;void dfs(int x, int d){ if (x == -1) return ; dep[x] = d; dfs(lch[x],d+1); dfs(rch[x],d+1);}void insert(int x){ int cur = 0; while(1){ if (x < a[cur]){ if (lch[cur] == -1){ a[cnt] = x; fa[cnt] = cur; mp[x] = cnt; lch[cur] = cnt++; return; } else { fa[lch[cur] ] = cur; cur = lch[cur]; } } else { if (rch[cur] == -1){ a[cnt] = x; fa[cnt] = cur; mp[x] = cnt; rch[cur] = cnt++; return; } else { fa[rch[cur] ] = cur; cur = rch[cur]; } } }}int find(int x){ if (x== root) return 0; if (!mp.count(x)) return -1; return mp[x];}char s[1000];int main(){ int n,x; scanf("%d",&n); memset(lch,-1,sizeof lch); memset(rch,-1,sizeof rch); scanf("%d",&root); a[0] = root; fa[0] = -1; for (int i = 1; i < n; ++i){ scanf("%d",&x); insert(x); } int q; scanf("%d",&q); dfs(0,0); int u,v; while(q--){ scanf("%d",&u); scanf("%s",s); if (strcmp(s,"is") == 0){ scanf("%s",s); scanf("%s",s);// cin >> s; cin >> s; if (!strcmp("root",s)){ if (u == root) { puts("Yes"); } else puts("No"); } else if (!strcmp(s,"parent")){ scanf("%s",s); scanf("%d",&v); int pos = find(v); if (pos == -1) { puts("No"); continue; } int fap = fa[pos]; if (v == root || a[fap] != u){ puts("No"); } else puts("Yes"); } else if (!strcmp(s,"left")){ scanf("%s",s); scanf("%s",s); scanf("%d",&v);// cin >> s; cin >> s; cin >>v; int pos = find(v); if (pos == -1) { puts("No"); continue; } int lp = lch[pos]; if (lp == -1 || a[lp] != u){ puts("No"); } else puts("Yes"); } else { scanf("%s",s); scanf("%s",s); scanf("%d",&v);// cin >> s; cin >> s; cin >>v; int pos = find(v); if (pos == -1){ puts("No"); continue; } int lp = rch[pos]; if (lp == -1 || a[lp] != u){ puts("No"); } else puts("Yes"); } } else { scanf("%d",&v);// cin >>v; scanf("%s",s); scanf("%s",s);// cin >>s; cin >> s; if (!strcmp("on",s)){ scanf("%s",s); scanf("%s",s); scanf("%s",s);// cin >> s ; cin >> s; cin >> s; int p1 = find(u); int p2 = find(v); if (p1 == -1||p2 == -1) { puts("No"); continue; } if (dep[p1] != dep[p2]) puts("No"); else puts("Yes"); } else { int p1 = find(u); int p2 = find(v); if (p1 == -1 || p2 == -1){ puts("No"); continue; } if (fa[p1] != fa[p2]) puts("No"); else puts("Yes"); } } } return 0;}
L3-016. 二叉搜索树的结构
时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越
二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉搜索树。(摘自百度百科)
给定一系列互不相等的整数,将它们顺次插入一棵初始为空的二叉搜索树,然后对结果树的结构进行描述。你需要能判断给定的描述是否正确。例如将{ 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”,每句占一行。
输入样例:52 4 1 3 082 is the root1 and 4 are siblings3 and 0 are on the same level2 is the parent of 43 is the left child of 41 is the right child of 24 and 0 are on the same level100 is the right child of 3输出样例:
YesYesYesYesYesNoNoNo
提交代码
0 0
- 团体程序设计天梯赛-练习集 -- L3-016. 二叉搜索树的结构(模拟)
- 团体程序设计天梯赛-练习集 -- L3-010. 是否完全二叉搜索树
- PAT-团体程序设计天梯赛-练习集- L3-010 是否完全二叉搜索树【三星级】
- 团体程序设计天梯赛-练习集 L3-010. 是否完全二叉搜索树
- 2017年团体程序设计天梯赛-总决赛 L3-1. 二叉搜索树的结构
- 团体程序设计天梯赛L3-016 二叉搜索树的结构
- 团体程序设计天梯赛 决赛 L3 是否完全二叉搜索树
- L3-010. 是否完全二叉搜索树-PAT团体程序设计天梯赛GPLT
- 团体程序设计天梯赛L3-010 是否完全二叉搜索树
- 团体程序设计天梯赛L3-010 是否完全二叉搜索树
- L3-2堆栈 团体程序设计天梯赛-练习集
- 团体程序设计天梯赛-练习集 L3-001. 凑零钱
- 团体程序设计天梯赛-练习集 L3-001. 凑零钱
- 团体程序设计天梯赛-练习集 L2-4. 这是二叉搜索树吗? 区间递归
- 团体程序设计天梯赛-练习集 L2-004. 这是二叉搜索树吗?GU
- 团体程序设计天梯赛-练习集L2-004. 这是二叉搜索树吗
- 团体程序设计天梯赛-练习集-L2-004. 这是二叉搜索树吗?
- 团体程序设计天梯赛-练习集 L2-004. 这是二叉搜索树吗? 解题报告
- Bootstrap进度条与AJAX后端数据传递结合使用
- 反向代理【nginx】
- Linux中文件查看命令cat/more/less
- 剑指offer-5.用两个栈实现队列
- Java图形界面Swing之窗体居中设置
- 团体程序设计天梯赛-练习集 -- L3-016. 二叉搜索树的结构(模拟)
- spring hibernate事务的流程
- 基于路由机制设计的app架构思路
- 装饰模式
- android 创建版本为1的数据库
- 自定义 matplotlib 设置
- 关于线程基础
- 简述DCL失效原因,解决方法
- POJ