|树的每一层叶子节点的个数|1004 Counting Leaves (30分)

在这里插入图片描述求每一层的叶子节点数
注意点:
1.到底有几层?所以用了maxDepth来保存最深的层数
便于后续来输出每层的层数
2.如何保存每层的层数
HashTable[]散列表来存储,下标是层数,元素是叶子个数

#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;

int n,m,maxDepth=0;
int hashTable[110]={
    
    0};
vector<int> Node[110];


void dfs(int index,int depth){
    
    
    if(Node[index].size()==0){
    
    //孩子节点
        hashTable[depth]++;
        if(depth>maxDepth){
    
    
            maxDepth=depth;
        }
    }else{
    
    
        for(int i=0;i<Node[index].size();i++){
    
    
            dfs(Node[index][i],depth+1);
        }
    }
    
    
}


int main()
{
    
    
    cin>>n>>m;
    for(int i=0;i<m;i++){
    
    
        int id_father,num_child,id_child;
        cin>>id_father>>num_child;
        for(int j=0;j<num_child;j++){
    
    
            cin>>id_child;
            Node[id_father].push_back(id_child);//建树
        }
    }
    
    dfs(1,1);
    for(int i=1;i<=maxDepth;i++){
    
    
        if(i==1)
            cout<<hashTable[i];
        else
            cout<<" "<<hashTable[i];
    }
    return 0;
}

draw inspiration from the following questions:

1094 The Largest Generation (25分)
最多节点数、层编号

//总节点的个数,有孩子的节点的个数
//23 13
//ID K ID[1] ID[2]....节点编号 孩子个数 孩子编号1 孩子编号2.....孩子编号n
#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;
int n,m;
int hashTable[110]={
    
    0};//散列表-----记录每一层的节点个数,下标是第几层,元素是个数
vector<int> Node[110];

void dfs(int index,int depth){
    
    
    if(Node[index].size()==0){
    
    //根节点
        hashTable[depth]++;
        return;
    }else{
    
    
        hashTable[depth]++;
    for(int i=0;i<Node[index].size();i++){
    
    
        dfs(Node[index][i],depth+1);//遍历所有孩子节点,进行递归
    }
  }
}
int main()
{
    
    
    cin>>n>>m;
    for(int i=0;i<m;i++){
    
    
        int id_parent,num_child;
        cin>>id_parent>>num_child;
        for(int j=0;j<num_child;j++){
    
    
            int id_child;
            cin>>id_child;
             //它给出了有孩子的节点情况,叶子节点信息没给出
            //所以不用记录叶子节点,不做操作,给出的做,那叶子节点不也突出了吗?
            Node[id_parent].push_back(id_child);//建树
        }
    }
    dfs(1,1);//根节点编号是1,层数是1
    int maxdepth=0,maxValue=0;
    for(int i=1;i<110;i++){
    
    
        if(hashTable[i]>maxValue){
    
    
            maxValue=hashTable[i];
            maxdepth=i;
        }
    }
    printf("%d %d",maxValue,maxdepth);
  return 0;
}

1090 Highest Price in Supply Chain (25分)
最大价值的叶子节点个数

#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
using namespace std;

int n,root,maxDepth=0,num;
double p,r;
vector<int> child[100010];

void dfs(int index,int depth){
    
    
    if(child[index].size()==0){
    
    //没有孩子,到达根节点了
        if(depth>maxDepth){
    
    
            maxDepth=depth;
            num=1;
        }else if(depth==maxDepth){
    
    
            num++;
        }
        return;
    }
    for(int i=0;i<child[index].size();i++){
    
    
        dfs(child[index][i],depth+1);//递归访问节点index的子节点
    }
}

int main()
{
    
    
  scanf("%d %lf %lf",&n,&p,&r);
  for(int i=0;i<n;i++){
    
    
      int tmp;
      scanf("%d",&tmp);
      if(tmp==-1){
    
    
          root=i;
      }else{
    
    
          child[tmp].push_back(i);
      }
  }
  dfs(root,0);
  printf("%.2f %d",p*pow(1+0.01*r,maxDepth),num);//根节点为第0层  
  return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44769957/article/details/109074706
今日推荐