DS树--找出直系亲属

开发者的避坑指南:在Apple Silicon Mac上构建RocketMQ Python客户端的完整心路历程 本文详细记录了在Apple Silicon Mac上构建RocketMQ Python客户端的完整过程,重点解决了架构兼容性问题。通过源码编译rocketmq-client-cpp库,修复构建脚本和CMake配置,最终成功在M2芯片MacBook Pro上部署RocketMQ Python客户端,为开发者提供了实用的避坑指南。 阅读详情

Description

如果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-

Input

输入包含多组测试用例,每组用例首先包含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时结束输入。

Output

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

Sample

Input

Output

3 2
ABC
CDE
EFG
FA
BE
0 0
great-grandparent
-
4 3
ABH
BCD
DEF
EWY
BF
CH
AW
0 0
grandchild
-
great-great-grandchild

思路:

首先建树。我的想法是按题目所给的三个字符的关系来建一部分树,然后再组合到整体的树中。

然后在建好的树中去找关系。为了方便,两个节点就一直往上找父母亲,谁能找到对方就能确定关系。

(详细请看代码,已写了充足的注释)

代码实现:

#include <iostream>
#include <queue>

using namespace std;

class btnode
{
public:
    char data;                               // 数据
    btnode *leftChild, *rightChild, *parent; // 指针 (此处left,rigth表示父母,parent才是子代)
    btnode() : leftChild(NULL), rightChild(NULL), parent(NULL) {}
    ~btnode()
    {
        delete leftChild;
        delete rightChild;
        delete parent;
    }
};

class BinaryTree
{
private:
    btnode *root = NULL; // 根

public:
    BinaryTree() : root(NULL){};
    btnode *findNode(char ch);              //寻找节点
    void part(string str);                  //部分建树
    void relationship(char fir, char sec);  //查找关系
};

//寻找节点,这里我用的是层次遍历的方法,检测到有对应的节点就返还该节点的指针,无则返回空指针。
btnode *BinaryTree::findNode(char ch)
{
    btnode *t = root;
    btnode *ans = nullptr;
    queue<btnode *> dt;

    dt.push(t);

    while (root && !dt.empty())
    {
        if (ch == dt.front()->data)
        {
            ans = dt.front();
            break;
        }
        if (dt.front()->leftChild)
            dt.push(dt.front()->leftChild);
        if (dt.front()->rightChild)
            dt.push(dt.front()->rightChild);
        dt.pop();
    }

    return ans;
}

//部分建树,按题目所给字符串分为子代和父母亲三部分,而后进行连接
void BinaryTree::part(string str)
{
    btnode *p[3], *temp;

    for (int i = 0; i < 3; i++) //三部分
    {
        temp = findNode(str[i]); //查找对应的字符
        
        if (i == 0 && !root) //检测根节点是否存在,没有就建立根节点
        {
            root = new btnode();
            root->data = str[0];
            p[0] = root;
        }
        else if (temp) //检测所查找的字符是否已经存在树中,有则将其与其他部分与其链接,无则新建。
        {
            p[i] = temp;
            if (temp == root) //检测根节点是否为父母一方,是则改变根节点为该新建的部分树的子代。
                root = p[0];
        }
        else
        {
            p[i] = new btnode();
            p[i]->data = str[i];
        }
    }

    //进行连接
    p[0]->leftChild = p[1];
    p[0]->rightChild = p[2];
    p[1]->parent = p[0];
    p[2]->parent = p[0];
}


//查找关系
void BinaryTree::relationship(char fir, char sec)
{
    btnode *p[2] = {findNode(fir), findNode(sec)};
    char ch[2] = {sec, fir};

    int count;
    int flag = -1;

    for (int i = 0; i < 2; i++)
    {
        //计数
        count = 0;

        //两次都向上查找
        while (p[i]->parent)
        {
            count++;
            p[i] = p[i]->parent;
            if (p[i]->data == ch[i % 2])
            {
                flag = i;
                break;
            }
        }
        if (flag != -1)break;
    }
    
    //按照flag指示输出.
    if (flag != -1)
    {
        while ((count--) - 2 > 0)
        {
            cout << "great-";
        }
        if ((count) == 1)
        {
            cout << "grand";
        }
        cout << ((!flag) ? "parent" : "child") << endl;
    }
    else
    {
        cout << "-" << endl;
    }
}

int main()
{
    int n, t;
    string str;
    char fir, sec;

    while (cin >> n >> t)
    {
        if (!n && !t)
            break;

        BinaryTree bt;

        while (n--)
        {
            cin >> str;
            bt.part(str);
        }

        while (t--)
        {
            cin >> fir >> sec;
            bt.relationship(fir, sec);
        }
    }

    return 0;
}

飞牛NAS1.1.19更新后SSH连不上?两步快速恢复连接 飞牛NAS1.1.19版本更新后SSH无法连接😟,实则是官方安全策略升级默认关闭了该服务,本文分享两步实操配置恢复SSH连接💻,还同步了官方的设备安全配置建议,帮助用户兼顾使用与设备防护🔒。 阅读详情

相关推荐

MTK平台LCD驱动开发实战:从零开始点亮你的Android屏幕

本文详细介绍了在MTK平台进行Android LCD驱动开发的完整流程。从理解LK与Kernel双核驱动框架入手,手把手讲解驱动结构体、屏幕参数配置、初始化序列编写以及PLL_CLOCK计算等核心步骤,并提供了系统集成配置与实用的调试避坑指南,帮助开发者高效点亮新屏幕。

terraform7cloud的博客 292

1035.寻找直系亲属

题目描述: 如果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-。 输入: 输入包含多组

小撸点的专栏 848

ANSYS Help USER300

USER 300概述单元描述输入数据假设与限制条件 概述 单元描述 Mechanical APDL提供了一种方便的方法来创建自定义的单元,命名为USER300,可以创建几乎任何单元类型。 UserElem子程序为Mechanical APDL在单元类型创建上提供了一个接口,可传递用户自定义单元创建时所需的所有数据,然后从自定义单元返回所有数据和结果,以更新数据库和文件。因为通过接口可以访问数据库和文件信息,所以很少需要了解Mechanical APDL数据库程序和文件结构。该接口还提供了获取Mechanic

weixin_47019765的博客 2234

找出直系亲属--c++

#include<cstdio> #include<iostream> #include<string> using namespace std; const int maxn=27; int son[maxn]; void Initial() { for(int i=0;i<maxn;i++) { son[i]=0; } } bo...

baidu_37143827的博客 726

Win11 C盘爆满别慌!手把手教你安全迁移AppData和用户文件夹(附一键脚本)

本文针对Win11 C盘空间不足问题,提供了一套安全有效的解决方案。通过深入解析用户目录结构,指导用户利用符号链接和Robocopy工具,将AppData、下载文档等占用大户迁移至其他分区,并附带了自动化脚本,从根本上实现C盘瘦身,同时确保系统稳定和数据安全。

weixin_29231221的博客 2087

人工智能之语言领域 自然语言处理 第六章 情感分析

情感分析(Sentiment Analysis),又称意见挖掘(Opinion Mining),旨在自动识别和提取文本中表达的主观情感、态度或情绪。从用户评论到社交媒体,从产品反馈到政治舆情,情感分析已成为企业决策、品牌监控和人机交互的关键技术。本章将深入介绍情感分析的层级结构、核心技术、主流模型,并通过社交媒体舆情实战案例完整演示分析与可视化流程。层级目标示例词级(Word-level)判断单个词的情感倾向“好” → 正面;“差” → 负面句级(Sentence-level)判断整个句子的情感极性。

咚咚王者的博客 856

【id:95】【5分】C. DS树--找出直系亲属

如果A,B是C的(外)曾祖父,曾祖母,则A,B是C的great-grandparent,C是A,B的great-grandchild,输入包含多组测试用例,每组用例首先包含2个整数n(0<=n<=26)和m(0<m<50), 分别表示有n个亲属关系和m个问题,如果A,B是C的(外)祖父,祖母,则A,B是C的grandparent,C是A,B的grandchild,如果A,B是C的父母亲,则A,B是C的parent,C是A,B的child,然后接下来是n行的形式如ABC的字符串,表示A的父母亲分别是B和C,

归忆_AC的博客 596

三相逆变器双pi控制器参数如何调节_光伏逆变器短路特性简析

1前言短路故障相对于其他故障类型来说是比较常见的,不同的设备的短路故障,大了讲都一样,细了说各有千秋,今天我们主要聊聊光伏逆变器的短路特征。电力系统中的电源,传统意义是指的是并入电力系统的同步发电机。但随着分布式发电技术的发展,各种形式的发电装置并入电力系统。按照分布式电源并网的方式,我们大致可以分为以下三类:➤通过旋转电机和变流器并联并网的电源,主要指双馈风力发电系统;➤仅仅通过变流器...

weixin_39901404的博客 1732

二叉树生成及遍历

文章目录二叉树生成及遍历一、树的简介二、二叉树简介三、生成二叉树四、二叉树的递归五、全部代码 二叉树生成及遍历 前言:由于这样介绍的为二叉树,这里只介绍关于树的基本概念。 一、树的简介 树是一种数据结构,它是由n(n>0)个有限结点组成的一个具有层次关系的集合。树的每个结点有零个或多个子节点,没有父结点的结点称为根节点;每一个非根结点有且仅有一个父节点,除了根节点外,每个子节点可以分为多个不相交的子树。 二、二叉树简介 (摘自百度)二叉树(Binary tree)是树形结构的一个重要类型。许多实际问

weixin_45483328的博客 1493

Cadence OrCAD Capture原理图中为功能模块分配ROOM的方法

本文详解介绍原理图设计阶段为原理图模块分配ROOM的方法。

fydar的博客 1345

Marvell 88Q6113 如何制作一个完整的量产固件88Q6113_flash.bin并进行烧录

本章节介绍如何基于Marvell工具链,制作一个完整的量产固件88Q6113_flash.bin,集成用户自定义的配置文件 config.bin,用于88Q6113的Flash烧录。注:Marvell 88Q5072 与 Marvell 88Q6113 的配置流程是一样的。

老板来份猪脚拼叉烧的博客 2008

九度1035 -树 - 找出直系亲属

这道题目一开始我还以为是并查集,后来发现比并查集简单的多,就是一个家谱树,然后找到两个节点之间的深度差。 #include int data[30]; void make_set(){ for(int i=0;i<30;i++) data[i]=-1; } int find(int a,int b){ int re=1; while(data[

不要说话的博客 2330

锂电池SOC估计 | 基于LSTM长短期记忆神经网络的锂电池SOC估计(附matlab完整代码)

锂电池SOC估计 | 基于LSTM长短期记忆神经网络的锂电池SOC估计(附matlab完整代码)

前程算法屋的博客 1022

F. DS树--找出直系亲属

如果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个人是直系亲属,请按题目描述输出2者的关系,如果没有直系关系,请输出-。具体含义和输出格式参见样例.当n和m为0时结束输入。

2401_85560805的博客 722

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

找出直系亲属 研究生机试 树

思路:由于没有分左右节点,故不用分左右子树。直接建立从母节点到子节点的的树即可 #include<iostream> using namespace std; #include<string> int n,m; int tree[150]; string fa[3]={"","parent","grandparent"}; string son[3]={"","child","grandchild"}; int steps; void initial() { for(int i

weixin_45448563的博客 300

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

HDU 3786 找出直系亲属 dfs搜索

找出直系亲属 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1164    Accepted Submission(s): 482 Problem Description 如果A,B是C的父母亲,则A,B是C的p

凌风 2224

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

题目1035:找出直系亲属(树的深度)

题目链接:http://ac.jobdu.com/problem.php?pid=1035 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: // // 1035 找出直系亲属.cpp // Jobdu // // Created by PengFei_Zheng on 30/04/2017. // Copyr...

weixin_30840573的博客 387

找出直系亲属

题目1035:找出直系亲属 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1226 解决:485 题目描述:     如果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的(外)曾祖父,

Ocean 1601

找出直系亲属【浙江大学】★

题目链接 解题思路 使用二叉树存亲子关系,然后通过深搜查找 #include<bits/stdc++.h> using namespace std; vector<int> G[30]; int opt; void dfs(int s, int e, int step){ if(s == e) { opt=step; return; } for(int j=0...

姚军 553

⭐⭐⭐【DFS+理解题意】找出直系亲属

文章目录题目描述代码实现码后反思 题目描述 代码实现 //我觉得使用DFS更简单易懂一些 //采用邻接表记录 #include <cstdio> #include <iostream> #include <string> #include <vector> using namespace std; const int maxn = 30; vector<int> adj[maxn]; int n; int m; int res; void .

yc_cy1999的博客 388

牛客网浙江大学机试--找出直系亲属

题目: 牛客网链接 概述: 用三个字母表示出三个人的关系,并回答提出的问题。 思路: 这题采用两种方法: 采用数组解决问题 数组用来存储子女的下标(反正是独生子女),找关系的时候就不断地搜索子女。这里分为两种情况,一种是第一个字母是第二个字母的长辈,另一个是第一个字母是第二个字母的晚辈。只要把参数顺序倒过来即可。 采用树的方法来解决问题。这里就没写粘贴的牛客网的代码。思路很清晰,很适合复习...

FGY_u的博客 514

题目1035:找出直系亲属

import java.util.Scanner; import java.io.IOException; import java.io.File; import java.io.FileReader; import java.io.BufferedReader; import java.io.InputStreamReader; class Main { private final sta

多看多听多总结 1301

牛客网——找出直系亲属

题目描述 如果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-。 输入描述: ...

weixin_30487201的博客 289

DS高阶:B树系列

B树系列的诞生本质上是为了解决外查找的问题

weixin_51142926的博客 5112
上一篇: DS二叉树—二叉树结点的最大距离
下一篇: 数学建模快速入门资料总结
Jenlibein
博客等级 码龄4年 187粉丝 27原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值