程序员社区

统计结点个数(双亲表示法)-北邮2013研究生复试

92. 统计节点个数

时间限制 1000 ms 内存限制 65536 KB

题目描述

给出一棵有向树,一共有N(1<N≤1000)个节点,如果一个节点的度(入度+出度)不小于它所有儿子以及它父亲的度(如果存在父亲或儿子),那么我们称这个节点为p节点,现在你的任务是统计p节点的个数。

如样例,第一组的p节点为1,2,3;第二组的p节点为0。

输入格式

第一行为数据组数T(1≤T≤100)。
每组数据第一行为N表示树的节点数。后面为N−1行,每行两个数x,y(0≤x,y<N),代表y是x的儿子节点。

输出格式

每组数据输出一行,为一个整数,代表这棵树上p节点的个数。

输入样例

2
5
0 1
1 2
2 3
3 4
3
0 2
0 1

输出样例

3
1

代码:

/*
92. 统计节点个数
时间限制 1000 ms 内存限制 65536 KB
题目描述

给出一棵有向树,一共有N(1<N≤1000)个节点,如果一个节点的度(入度+出度)不小于
它所有儿子以及它父亲的度(如果存在父亲或儿子),那么我们称这个节点为p节点,现在你的任务是统计p节点的个数。

如样例,第一组的p节点为1,2,3;第二组的p节点为0。
输入格式

第一行为数据组数T(1≤T≤100)。
每组数据第一行为N表示树的节点数。后面为N-1行,每行两个数x,y(0≤x,y<N),代表y是x的儿子节点。
输出格式

每组数据输出一行,为一个整数,代表这棵树上p节点的个数。
输入样例

2
5
0 1
1 2
2 3
3 4
3
0 2
0 1

输出样例

3
1
Project: Tree_parent(树-双亲表示法)
Date:    2019/02/25
Author:  Frank Yu
基本操作函数:
InitTree(Tree &T) 参数T,树根节点 作用:初始化树,先序递归创建
InsertParent(Tree &T, TElemType node1, TElemType node2) 插入双亲数组得到双亲域 参数:树T ,结点node1,结点node2 node1为node2的双亲 作用:使双亲数组中,node2对应的双亲域为node1的下标
GetIndegree(Tree &T, TElemType node) 得到某结点入度
GetOutdegree(Tree &T, TElemType node) 得到某结点出度
功能实现函数:
Getdegree(Tree T,TElemType node) 得到某点的度
CreateTree(Tree &T) 参数T,树根节点 作用:创建树,调用InsertParent
CountNode(Tree &T) 统计结点
*/
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<string>
#include<stack>
#include<queue>
#include<algorithm>
#include<iostream>
#define TElemType int
#define Max 1000
using namespace std;
//树的结点数据结构
typedef struct TNode
{
    TElemType data;//数据域
    int parent;    //双亲
}TNode;
//树的数据结构
typedef struct Tree
{
    TNode parent[Max];
    int NodeNum;
}Tree;
//********************************基本操作函数********************************//
//创建树 规定数据域为#,则为空 双亲为-1,则为空
void InitTree(Tree &T,int N)
{
    for (int i=0;i<N;i++)
    {
        T.parent[i].data = i;
        T.parent[i].parent = -1;
    }
    T.NodeNum = N;
}
//插入双亲数组得到双亲域 参数:树T ,结点node1,结点node2 node1为node2的双亲 作用:使双亲数组中,node2对应的双亲域为node1的下标
bool InsertParent(Tree &T, TElemType node1, TElemType node2)
{
    T.parent[node2].parent = node1;
    return true;
}
//得到某结点入度 参数:树T,结点node 
int GetIndegree(Tree &T, TElemType node)
{
        if(T.parent[node].parent!=-1)return 1;//双亲只能有一个
        else return 0; //根节点没有双亲,即没有入度
}
//得到某结点出度 参数:树T,结点node
int GetOutdegree(Tree &T, TElemType node)
{
    int outdegree = 0;
    for (int i = 0;i < T.NodeNum;i++)
    {
        if (T.parent[i].parent == node)outdegree++;
    }
    return outdegree;
}
//**********************************功能实现函数*****************************//
//得到某点的度
int Getdegree(Tree T,TElemType node)
{   
  return GetIndegree(T,node)+GetOutdegree(T,node);
} 
//创建树,调用InsertParent
void CreateTree(Tree &T)
{
    int parent=T.NodeNum-1;
    TElemType node1,node2;
    while (parent--)
    {
        cin >> node1>>node2;
        InsertParent(T,node1,node2);
    }
}
//统计结点 
int CountNode(Tree &T)
{
    int count=0;
    bool flag;
    for(int i=0;i<T.NodeNum;i++)//遍历,比较结点i的度及它的双亲和左右孩子的度 
    {
      flag = true;//true是p结点 
      //cout<<Getdegree(T,i)<<" ";
      if(T.parent[i].parent!=-1)//非根,比较父节点 
      {
        if(Getdegree(T,i)<Getdegree(T,T.parent[i].parent)) 
          {
            flag=false;//比双亲的度小,不是p结点 
            continue;
          }
      }
      for(int j=0;j<T.NodeNum;j++)//比较所有孩子结点的度 
      {
        if(T.parent[j].parent==i)
        {
            //cout<<Getdegree(T,j)<<" ";
            if(Getdegree(T,i)<Getdegree(T,j))
            {
              flag=false;
              break;//比孩子度的小,不是p结点 
            } 
        }
      } 
      if(flag)count++;
    }
    return count;
}
//主函数
int main()
{
    int M,N;
    Tree T;
    cin>>M;
    while(M--)
    {
        cin>>N;
        InitTree(T,N);
        CreateTree(T);
        cout<<CountNode(T)<<endl;
    } 
    return 0;
}
赞(0) 打赏
未经允许不得转载:IDEA激活码 » 统计结点个数(双亲表示法)-北邮2013研究生复试

一个分享Java & Python知识的社区