老嘟 2023-07-14 20:14 采纳率: 0%
浏览 6

关于节点的度的问题,如何解决?(语言-c++)

节点的度
题目描述
"节点的度"指以该节点为端点的边的条数。"偶点"指度为偶数的节点。
给你一棵n个节点的有根树,节点标号为1~n,1号节点为根节点。特别的,每个点的子节点个数不超过5。
请你输出该树中偶点的个数。
输入
第一行一个整数n。
以后n行,每行若干个整数。第i行,第一个数为mi,表示节点i的子节点个数。紧接着mi个整数,表示节点i子节点的编号。保证父节点编号小于子节点。
输出
一行一个整数,表示偶点个数。

输入  复制
3
2 2 3
0
0

输出  复制
(1(2,3))

#include<bits/stdc++.h>
using namespace std;
struct c{
    int data;
    c* next;
};
struct p{
int data;
c* child;
};
struct tree{
    p a[100];
    int n;
};
tree t; 
int main()
{
    cin>>t.n;
    for(int i=1;i<=t.n;i++)
    {
        cin>>t.a[i].data;
        t.a[i].child=NULL;
        int cn;
        cin>>cn;
        if(cn!=0)
            {
            t.a[i].child=new c;
            cin>>t.a[i].child->data;
            t.a[i].child->next=NULL;
            c*p=t.a[i].child;
        while(cn){
            c*s=new c;
            cin>>s->data;
            s->next=NULL;
            p->next=s;
            p=p->next;
            cn--;
            }
        }
    }
    cout<<"1"<<endl;
    for(int i=1;i<=t.n;i++){
        c*k=t.a[i].child;
        while(k)
        {
            cout<<t.a[i].data<<"."<<t.a[k->data].data<<endl; 
            k=k->next;
        }
    }
    return 0;
}

可以改一下吗?

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-07-14 22:24
    关注
    • 你可以看下这个问题的回答https://ask.csdn.net/questions/356450
    • 除此之外, 这篇博客: 每日一题--20200408--约瑟夫环问题:已知n个人围成一圈(编号:1,2,3,…,n),从编号为1的人开始报数,报数为m的那个人出列;从他的下一个人又从1开始数,同样报数为m的人出列;依此循环下中的 已知n个人围成一圈(编号:1,2,3,…,n),从编号为1的人开始报数,报数为m的那个人出列;从他的下一个人又从1开始数,同样报数为m的人出列;依此循环下去,直到剩余一个人。求最后这一个人在最开始的序列中编号是几号? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    • #include <stdio.h>
      int main ( )
      {
      	//1
          int n,m,out = 0,count = 0;
          printf("n = ");
          scanf("%d",&n);
          printf("m = ");
          scanf("%d",&m);
          //2
          int a[n] ;
          for (int j = 0; j < n; j++) a[j] = 1 + j;
          int i = 0 ;
          while(out != n -1)
          {
              if (a[i] != 0) {
                  count++;
              }
              if (count == m) {
                  count = 0;
                  a[i] = 0;
                  out++;
              }
              i++;
              if (i == n) {
                  i = 0;
              }
              
          }
          for (int i = 0; i < n; i++) {
              if (a[i] != 0) {
                  printf("%d",a[i]);
              }
          }
      }
      

      思路:
      其实计算机的思维很简单,只需要用最简单的描述就可以做到解决看起来很难的数学题,只要掌握题目的规律,找最简单的循环体就可以,就像数学归纳法不也是很万能的解题方式吗?

      1. 首先–>接受变量
      2. 声明一个数组来存序号(计算机的思维,零与非零)
      3. 元素就是序号,当这个被挤出去了后序号变为零,看最终剩下的最后一个元素
      4. 后面遇到零的时候就不数它
      5. 一共有n个元素,最后只剩一个
      6. 数的时候注意,因为是一个圈存的数据,数组就像是位置,位置不可以变多,绕了一圈以后要归零
      7. 最终剩下的数组元素就是我们要的序号

      不要去想着一开始的序号要存起来,出去的人连带位置一同出去,那样很麻烦

    • 以下回答由chatgpt基于相关博客总结生成:

      下面是计算有根树中偶点个数的算法实现

      #include <iostream>
      #include <vector>
      
      using namespace std;
      
      // 定义图的节点
      struct TreeNode {
          int val;
          vector<TreeNode*> children;
          TreeNode(int v) : val(v) {}
      };
      
      // 计算有根树中的偶点个数
      int countEvenPoints(TreeNode* root) {
          // 如果root为空,则无偶点,直接返回0
          if (!root) {
              return 0;
          }
      
          int count = 0;
          // 遍历树的每个节点
          for (TreeNode* child : root->children) {
              // 递归计算子节点中的偶点个数
              count += countEvenPoints(child);
          }
      
          // 如果节点的度为偶数,则将其计入偶点个数中
          if (root->children.size() % 2 == 0) {
              count++;
          }
      
          return count;
      }
      
      int main() {
          int n;
          cin >> n;
      
          // 创建树的节点
          vector<TreeNode*> nodes(n);
          for (int i = 0; i < n; i++) {
              nodes[i] = new TreeNode(i+1);
          }
      
          // 建立树的连接关系
          for (int i = 0; i < n; i++) {
              int m;
              cin >> m;
              for (int j = 0; j < m; j++) {
                  int child;
                  cin >> child;
                  nodes[i]->children.push_back(nodes[child-1]);
              }
          }
      
          // 计算有根树中的偶点个数
          int answer = countEvenPoints(nodes[0]);
      
          cout << answer << endl;
      
          // 释放内存
          for (TreeNode* node : nodes) {
              delete node;
          }
      
          return 0;
      }
      

      上面的程序通过输入节点的数量、节点的子节点个数和子节点的编号来构建一棵有根树,并使用递归的方式计算了有根树中的偶点个数。程序通过定义TreeNode结构体来表示树的节点,其中包含节点的值以及子节点的指针。在countEvenPoints函数中,通过遍历节点的子节点来递归计算各子树中偶点的个数,并累加到count变量中。最后,判断根节点的子节点个数是否为偶数,如果是则将其计入偶点个数中。最后输出偶点个数。

    评论

报告相同问题?

问题事件

  • 创建了问题 7月14日

悬赏问题

  • ¥15 windows2019+nginx+php耗时久
  • ¥15 labelme打不开怎么办
  • ¥35 按照图片上的两个任务要求,用keil5写出运行代码,并在proteus上仿真成功,🙏
  • ¥15 免费的电脑视频剪辑类软件如何盈利
  • ¥30 MPI读入tif文件并将文件路径分配给各进程时遇到问题
  • ¥15 pycharm中导入模块出错
  • ¥20 Ros2 moveit2 Windows环境配置,有偿,价格可商议。
  • ¥15 有关“完美的代价”问题的代码漏洞
  • ¥15 请帮我看一下这个简易化学配平器的逻辑有什么问题吗?
  • ¥15 暴力法无法解出,可能要使用dp和数学知识