题目描述

如果A,B是C的父母亲,则A,B是C的parent,C是A,B的child,如果A,B是C的(外)祖父,祖母,则A,B是C的grandparent,C是A,B的grandchild,如果A,B是C的(外)曾祖父,曾祖母,则A,B是C的great-grandparent,C是A,B的great-grandchild,之后再多一辈,则在关系上加一个great-

输入

输入包含多组测试用例,每组用例首先包含2个整数n(0<=n<=26)和m(0<m<50), 分别表示有n个亲属关系和m个问题, 然后接下来是n行的形式如ABC的字符串,表示A的父母亲分别是B和C,如果A的父母亲信息不全,则用-代替,例如A-C,再然后是m行形式如FA的字符串,表示询问F和A的关系。
当n和m为0时结束输入。

输出

如果询问的2个人是直系亲属,请按题目描述输出2者的关系,如果没有直系关系,请输出-。
具体含义和输出格式参见样例.

输入样例

解题思路:

先建树,然后从位于上面的那个data较小的node开始往下找data较大的node。

思路说起来简单,但lookfor()函数和lookfor2()函数可着实费了我心思,尤其是lookfor2()的返回值。

#include <iostream>
using namespace std;
class BiTreeNode {
public:char  data;                  //数据域BiTreeNode* leftChild, * rightChild, * parent;BiTreeNode() :leftChild(NULL), rightChild(NULL), parent(NULL) {}~BiTreeNode() {}
};class BiTree {
private:BiTreeNode* root;   //根结点指针
public:void Init() {root = new BiTreeNode();}void link(string str) {BiTreeNode* newroot = lookfor(root, str[0]);newroot->leftChild = new BiTreeNode();if (newroot->leftChild->data != '-')newroot->leftChild->data = str[1];newroot->rightChild = new BiTreeNode();if (newroot->rightChild->data != '-')newroot->rightChild->data = str[2];}void createTree(string ss) {root->data = ss[0];root->leftChild = new BiTreeNode();if (root->leftChild->data != '-')root->leftChild->data = ss[1];root->rightChild = new BiTreeNode();if (root->rightChild->data != '-')root->rightChild->data = ss[2];}BiTreeNode* lookfor(BiTreeNode*& root, char ch) {if (root != NULL) {if (root->data == ch) {return root;}else {BiTreeNode* i = lookfor(root->leftChild, ch);if (i != NULL) return i;BiTreeNode* j = lookfor(root->rightChild, ch);if (j != NULL) return j;return NULL;}}elsereturn NULL;}int lookfor2(BiTreeNode*& node, char ch, int i) {if (node != NULL) {if (node->data == ch) {return i;}int j = lookfor2(node->leftChild, ch, i + 1);if (j != -999) return j;int k = lookfor2(node->rightChild, ch, i + 1);if (k != -999) return k;if (i == 0)return -1;elsereturn -999;}elsereturn -999;}void output(char a, char b) {char xiao, da;int tag;if (a > b)xiao = b, da = a, tag = 0;elsexiao = a, da = b, tag=1;int depth;BiTreeNode* xiaonode = lookfor(root, xiao);depth = lookfor2(xiaonode, da, 0);if (depth == -1) {cout << "-" << endl;}else if (depth == 1) {if(tag==0)cout << "parent" << endl;elsecout << "child" << endl;}else if (depth == 2) {if (tag == 0)cout << "grandparent" << endl;elsecout << "grandchild" << endl;}else if (depth >= 3) {for (int x = 3; x <= depth; x++) {cout << "great-";}if (tag == 0)cout << "grandparent" << endl;elsecout << "grandchild" << endl;}}
};//主函数
int main()
{int n, m;string bulid;string search;while (cin >> n >> m && n != 0 && m != 0) {BiTree b;b.Init();for (int i = 0; i < n; i++) {cin >> bulid;if (i == 0) {b.createTree(bulid);}else {b.link(bulid);}}for (int i = 0; i < m; i++) {cin >> search;b.output(search[0], search[1]);}}return 0;
}

DS树--找出直系亲属相关推荐

  1. hdu3786 找出直系亲属 水题

    题意: 找出直系亲属 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  2. HDU3786 找出直系亲属【关系闭包】

    找出直系亲属 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  3. 九度OJ 1035:找出直系亲属(二叉树)

    题目1035:找出直系亲属 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1309 解决:521 题目描述: 如果A,B是C的父母亲,则A,B是C的parent,C是A,B的child,如 ...

  4. KY122 找出直系亲属

    KY122 找出直系亲属 def cntGen(parentsDict, descendant, ascendant):if descendant not in parentsDict:return ...

  5. 九度[1035]-找出直系亲属

    九度[1035]-找出直系亲属 题目描述: 如果A,B是C的父母亲,则A,B是C的parent,C是A,B的child,如果A,B是C的(外)祖父,祖母,则A,B是C的grandparent,C是A, ...

  6. 九度1035:找出直系亲属并查集

    题目描述: 如果A,B是C的父母亲,则A,B是C的parent,C是A,B的child,如果A,B是C的(外)祖父,祖母,则A,B是C的grandparent,C是A,B的grandchild,如果A ...

  7. HDU_3786 找出直系亲属- softbar

    Problem Description 如果A,B是C的父母亲,则A,B是C的parent,C是A,B的child,如果A,B是C的(外)祖父,祖母,则A,B是C的grandparent,C是A,B的 ...

  8. antd 表格树如何展开_如何分析工作,找出规律,使用excel大幅度提高工作效率...

    在职场中,掌握一定的excel知识,有时候可以极大的提高工作效率,减少加班次数. 但是有的人可能不知道如何去做,下面我使用一个我前几天遇到的工作场景,一步一步的来给大家展示一下,如何使用excel提高 ...

  9. HDU3534 给你一个树让你找出其中最长路径以及个数数

    Description In the Datastructure class of HEU, the teacher asks one problem: How to find the longest ...

  10. leetcode刷题之 树(14)-递归:找出二叉树中第二小的节点

    [LeetCode] Second Minimum Node In a Binary Tree 二叉树中第二小的结点 Given a non-empty special binary tree con ...

最新文章

  1. word2vect 输出是什么
  2. linux守护进程的编写
  3. 网页变成灰色,对重大事件表示哀悼
  4. ubuntu12.04samba服务器配置
  5. [Ext JS 4] 实战之Load Mask(加载遮罩)的显示与隐藏
  6. windows server 2012将计算机图标添加到桌面(图文教程)(转)
  7. linux7.4 root密码,[RHEL 7.4] 忘记root密码,普通用户又没有sudo权限,怎么办?
  8. smile——Java机器学习引擎
  9. 散列表的概念及其拉链法和常见的散列函数(C语言)
  10. matlab求含参数一元三次方程,matlab 求解一元三次方程,带其他参数
  11. 【武汉加油!中国加油!】挑战七天 实现机器视觉检测有没有戴口罩系统——第四五六七天
  12. ElasticSearch搜索引擎搭建笔记
  13. Java实现经纬度格式转化
  14. 基于聚类算法的图像分割技术
  15. 智商情商哪个重要_情商与智商,到底哪个更重要?
  16. 【算法】搜索算法—盲目搜索和启发式搜索
  17. [HAL]STM32 SPI+DMA驱动WS2812
  18. java 入门专题 字符缓冲输入流HashMap 集合的简单综合应用:文本排序
  19. 四、Arcgis实现深度学习河流训练样本数据的制作(使用软件批量获取样本图片)——对已经获取到的完整面状样本数据进行处理
  20. SAS杂谈--001--如何配置使用增强编辑器

热门文章

  1. 编译android版本protobuf
  2. ubuntu中GoldenDict的使用
  3. 新换的手机号码被人注册了微信怎么办?
  4. 下厨房内部孵化项目——懒饭产品体验分析报告
  5. 三位数求解:已知xyz+yzz=n,其中n是一个正整数,x、y、z都是数字(0-9),编写一个程序求出x、y、z分别代表什么数字。若无解,则输出“No Answer” 注意:xyz和yzz表示一个三
  6. windows 电脑如何查看电脑显卡内存(显存)、CPU型号、内存、USB集线器等配置信息 win+r dxdiag
  7. 用于分类的神经网络算法,图像识别神经网络算法
  8. 如何区别聚合支付“一清二清”?
  9. 词云python_诗词名句网 -古诗词大全|诗歌|诗词鉴赏|古诗名句|诗句赏析!
  10. MySQL(二) DDL、DML、DQL、DTL概述