zoukankan      html  css  js  c++  java
  • 1004 Counting Leaves

    1004 Counting Leaves

    A family hierarchy is usually presented by a pedigree tree. Your job is to count those family members who have no child.

    Input Specification:

    Each input file contains one test case. Each case starts with a line containing 0, the number of nodes in a tree, and M (<), the number of non-leaf nodes. Then M lines follow, each in the format:

    ID K ID[1] ID[2] ... ID[K]
    

    where ID is a two-digit number representing a given non-leaf node, K is the number of its children, followed by a sequence of two-digit ID's of its children. For the sake of simplicity, let us fix the root ID to be 01.

    The input ends with N being 0. That case must NOT be processed.

    Output Specification:

    For each test case, you are supposed to count those family members who have no child for every seniority level starting from the root. The numbers must be printed in a line, separated by a space, and there must be no extra space at the end of each line.

    The sample case represents a tree with only 2 nodes, where 01 is the root and 02 is its only child. Hence on the root 01 level, there is 0 leaf node; and on the next level, there is 1 leaf node. Then we should output 0 1 in a line.

    Sample Input:

    2 1
    01 1 02
    

    Sample Output:

    0 1


    //input :树中总结点数N 非叶子结点数M
    //       非叶子结点值ID 此非叶子结点的孩子数k 此非叶子结点的孩子值id[i]  (M个非叶子结点)
    //output: 每层的叶子结点数量
    //解题关键:确定每个结点有无孩子结点的标志值tag,每个结点的高度,设置父节点参数nodes[child].parent = ID;
    //问题:存在非叶子节点的hight在读入当前行时还未知的情况,可以先存入结点的父子关系,然后输入结束再计算hight
    /*问题例子:9 4
    
                01 2 02 03
    
                04 3 07 08 09
    
                03 2 05 06
    
                02 1 04
    */
    
    #include<stdio.h>
    #include<iostream>
    
    using namespace std;
    
    typedef struct Node{
        int hight;//结点所处高度
        int tag;// tag为0,则没有孩子,为1则有孩子
        int parent;//父节点
    };
    
    Node nodes[100]; //初始化是100个
    
    int main()
    {
        /*step1:构建树*/
    
        int N; //树中总结点数
        int M; //树中非叶子结点总数
        cin >> N;
        cin >> M;
        //初始化
        for(int i = 1;i <= N;i++)
        {
            nodes[i].hight = 1;
            nodes[i].tag = 0;
            nodes[i].parent = 0;
        }
        //存入父子结点关系
        int ID,k,child;
        for(int i = 0;i < M;i++)
        {
            cin >> ID;
            cin >> k;
            nodes[ID].tag = 1;
            for(int j = 0;j < k;j++)
            {
                cin >> child;
                nodes[child].parent = ID;
                //nodes[child].hight =  nodes[ID].hight + 1;
            }
        }
        //存入高度
        for(int i = 1;i <=N;i++)
        {
            for(int j = i + 1;j <= N;j++)
            {
                if(nodes[j].parent == i)
                {
                    nodes[j].hight = nodes[i].hight + 1;
                }
            }
        }
    
        /*step2:统计每层的叶子结点数,并输出*/
        //确定树的高度
        int maxh = 1;
        for(int i = 1;i <= N;i++)
        {
            if (maxh < nodes[i].hight)
            {
                maxh = nodes[i].hight;
            }
        }
        //确定每层高度的叶子节点数
        int result[100] = {0};//每层高度的叶子节点数
        for(int i = 1;i <= N;i++)
        {
            if (nodes[i].tag == 0)
            {
                result[nodes[i].hight]++;
            }
        }
        //输出
        for(int i = 1;i < maxh;i++)
        {
            cout << result[i] << " ";
        }
        cout << result[maxh]<<endl;
    
        return 0;
    }
  • 相关阅读:
    使用牛顿迭代法和二分法求解一个数的平方根(python语言实现)
    厄拉多塞筛法和普通方法求素数表(python实现)
    使用辗转相除法求两个数的最大公因数(python实现)
    我在博客园第一篇博文
    Linux安装maven
    MyBatis基础入门
    Maven的使用入门
    nginx的简单使用和使用nginx在windows上搭建tomcat集群
    后端程序员如何玩转AJAX
    Servlet3.0文件上传
  • 原文地址:https://www.cnblogs.com/meiqin970126/p/9548749.html
Copyright © 2011-2022 走看看