原题链接:获取树的规模
解题思路:
定义好树节点,内容应当使可以找到自己的孩子,父亲,以及孩子的个数和数值
创建树
如果是根节点
如果节点存在,直接修改相应的父亲值
不存在就创建节点
不是根节点
如果存在,就直接修改关系
不存在,创建并修改
从当前指向的节点找根节点
从根节点遍历整棵树
参考代码:
#include<cstdio>
#include<iostream>
using namespace std;
#define max 2005
struct tree
{
int data;
int n;//孩子个数
int child[5];//孩子下标
int father;//父亲下标
};
tree a[max];
int initi(int f,int s,int i)//创建树
{
int j=1;int p=0,q=0;
if(f==0)//如果是根节点
{
for(j=1;i<i;j++)
if(a[j].data==s)
break;
if(j!=i) a[j].father=0;
else
{
a[i].data=s;
a[i].n=0;
a[i].father=0;
i++;
}
return i;
}
else {
for(j=1;j<i;j++)
{
if(a[j].data==f) p=j;
if(a[j].data==s) q=j;
}
if(p==0)
{
p=i++;
a[p].data=f;
a[p].n=0;
a[p].father=0;
}
if(q==0)
{
q=i++;
a[q].data=s;
a[q].n=0;
}
a[q].father=p;
a[p].n++;
a[p].child[a[p].n-1]=q;
return i;
}
}
int findroot(int x)//x为下标,一个结点向上遍历找到根,返回root下标
{
if(a[x].father==0) return x;
else {
return findroot(a[x].father);
}
}
int traver(int r)//r为根节点下标,从根节点向下遍历,返回树的结点数ans ;
{
int ans=0;
ans=ans+1;
int i=0,q;
while(a[r].n--){
q=a[r].child[i];
ans=ans+traver(q);
i++;
}
return ans;
}
int main()
{
int i,j,k,ans;
int f,s;
int n;
scanf("%d",&n);
i=1;j=1;
while(j<=n)
{
scanf("%d%d",&f,&s);
i=initi(f,s,i);
j++;
}
int num;
scanf("%d",&num);
for(i=1;i<=n;i++)
{
if(a[i].data==num)
break;
}
int root =findroot(i);
ans =traver(root);
cout<<ans<<endl;
return 0;
}
6 分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复