找出直系亲属(树)

Posted szu-ds-wys

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了找出直系亲属(树)相关的知识,希望对你有一定的参考价值。

题目描述

如果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者的关系,如果没有直系关系,请输出-。
具体含义和输出格式参见样例.

样例输入

3 2 ABC CDE EFG FA BE 0 0

样例输出

great-grandparent -

提示

#include<iostream>
#include<map>
#define N 26
using namespace std;
class Node
{//二叉树节点
public:
    int p1;//第一个双亲的下标,-1表示不存在
    int p2;//第二个双亲的下标,-1表示不存在
};
int preOrder(Node *tree,int from, int to, int depth)
{//从from出发先序遍历到找到to为止,并返回to相对于from的深度
    if(from==to)
        return depth;
    if(tree[from].p1!=-1)
    {
        int ret=preOrder(tree,tree[from].p1,to,depth+1);
        if(ret!=-1)
            return ret;
    }
    if(tree[from].p2!=-1)
    {
        int ret=preOrder(tree,tree[from].p2,to,depth+1);
        if(ret!=-1)
            return ret;
    }
    return -1;
}
 
int main()
{
    int n,m;
    Node tree[N];//顺序存储,下标就是它所代表的字符编号,比如0代表‘A‘
    while(true)
    {
        cin>>n>>m;
        if(n==0||m==0)
            break;
        for(int i=0;i<N;i++)
        {
            tree[i].p1=tree[i].p2=-1;
        }
        while(n--)//构建树
        {
            char str[4];
            cin>>str;
            if(str[1]!=-)
                tree[str[0]-A].p1=str[1]-A;
            if(str[2]!=-)
                tree[str[0]-A].p2=str[2]-A;
        }
        while(m--)//查询
        {
            char str[3];
            cin>>str;
            int from=str[0]-A;
            int to=str[1]-A;
            int ans1=preOrder(tree,from,to,0);
            if(ans1==1)
                cout<<"child"<<endl;
            else if(ans1>=2)
            {
                for(int i=ans1;i>2;i--)
                    cout<<"great-";
                cout<<"grandchild"<<endl;
            }
            else//不是小辈,那就是长辈
            {
                int ans2=preOrder(tree,to,from,0);
                if(ans2==1)
                    cout<<"parent"<<endl;
                else if(ans2>=2)
                {
                    for(int i=ans2; i>2; i--)
                        cout<<"great-";
                    cout<<"grandparent"<<endl;
                }
                else
                    cout<<"-"<<endl;//也不是长辈,那就不是直系亲属
            }
        }
    }
    return 0;
}

以上是关于找出直系亲属(树)的主要内容,如果未能解决你的问题,请参考以下文章

1050: 找出直系亲属

1035.找出直系亲属(floyd)

SQL 查找树中的所有直系后代

如何找出前一个片段正在使用导航组件

找出当前显示的片段是啥的最佳方法是啥?

在一个无序整数数组中,找出连续增长片段最长的一段, 增长步长是1。Example: [3,2,4,5,6,1,9], 最长的是[4,5,6]