二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉搜索树。(摘自百度百科)
给定一系列互不相等的整数,将它们顺次插入一棵初始为空的二叉搜索树,然后对结果树的结构进行描述。你需要能判断给定的描述是否正确。例如将{ 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
分析:简单的二叉搜索树内结点关系问题~Tree中存储每个节点的信息,cnt保存每个节点的序列号,root为树的根,f的值表示问讯关系是否成立,Find查询节点数值对应的序列号。insert为插入新节点进入二叉搜索树的函数,按照规则判断左右孩子是否为空(用-1表示),是的话就当成新节点的位置插入~
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
#include <bits/stdc++.h> using namespace std; struct node { int num, lchild, rchild, parent, level; node() { lchild = rchild = parent = -1; } }Tree[128]; int n, m, a, b, in, cnt, root = 1, f; map<int, int> Find; string t; void insert(int x) { int now = root; while(Tree[now].num != x) { if (x < Tree[now].num) { if (Tree[now].lchild == -1) { Tree[cnt].num = x; Tree[cnt].level = Tree[now].level + 1; Tree[cnt].parent = now; Tree[now].lchild = cnt; } now = Tree[now].lchild; } else { if (Tree[now].rchild == -1) { Tree[cnt].num = x; Tree[cnt].level = Tree[now].level + 1; Tree[cnt].parent = now; Tree[now].rchild = cnt; } now = Tree[now].rchild; } } } int main() { cin >> n >> in; Tree[++cnt].num = in; Find[in] = cnt; for (int i = 1; i < n; i++) { cin >> in; Find[in] = ++cnt; insert(in); } cin >> m; while (m--) { f = 0; cin >> a >> t; if (t == "is") { cin >> t >> t; if (t == "root") { if (Find[a] == root) f = 1; } else if (t == "parent") { cin >> t >> b; if (Tree[Find[b]].parent == Find[a]) f = 1; } else if (t == "left") { cin >> t >> t >> b; if (Tree[Find[b]].lchild == Find[a]) f = 1; } else { cin >> t >> t >> b; if (Tree[Find[b]].rchild == Find[a]) f = 1; } } else { cin >> b >> t >> t; if (t == "siblings") { if (Find[a] && Find[b] && Tree[Find[a]].parent == Tree[Find[b]].parent) f = 1; } else { cin >> t >> t >> t; if (Find[a] && Find[b] && Tree[Find[a]].level == Tree[Find[b]].level) f = 1; } } cout << (f ? "Yes" : "No") << '\n'; } return 0; } |
❤ 点击这里 -> 订阅《PAT | 蓝桥 | LeetCode学习路径 & 刷题经验》by 柳婼