資料結構 找樹根和孩子(樹)
樹的儲存結構:
•方法1:陣列,稱為“父親表示法”。constint m = 10; //樹的結點數
struct node
{
int data, parent; //資料域,指標域
};
node tree[m];
例如:tree[2]=1;//表示節點2的父親節點為1
優缺點:利用了樹中除根結點外每個結點都有唯一的父結點這個性質。很容易找到樹根,但找孩子時需要遍歷整個線性表。
例題:找樹根和孩子
【問題描述】
給定一棵樹,輸出樹的根root,孩子最多的結點max以及他的孩子
【輸入格式】
第一行:n(結點數<=100),m(邊數<=200)。
以下m行;每行兩個結點x和y,
表示y是x的孩子(x,y<=1000)。
【輸出格式】
第一行:樹根:root。
第二行:孩子最多的結點max。
第三行:max的孩子。
【輸入樣例】
8 7
4 1
4 2
1 3
1 5
2 6
2 7
2 8
【輸出樣例】
4
2
6 7 8
分析:
程式碼:
#include<iostream>
using namespace std;
int n,m,tree[101]={0};
int main()
{
int i,x,y,root,maxroot,sum=0,j,Max=0;
cin>>n>>m;//節點和邊的數目
for(i=1;i<=m;i++)
{
cin>>x>>y;
tree[y]=x;//y是x的孩子
}
for(i=1;i<=n;i++)//找出樹根
{
if(tree[i]==0)// i的父親節點為0,即沒有父親節點
{
root=i;
break;
}
}
for(i=1;i<=n;i++)//找孩子最多的節點maxroot
{
sum=0;
for(j=1;j<=n;j++)
{
if(tree[j]==i) sum++;
}
if(sum>Max)
{
Max=sum;
maxroot=i;
}
}
cout<<root<<endl<<maxroot<<endl;
for(i=1;i<=n;i++)//maxroot的孩子
{
if(tree[i]==maxroot) cout<<i<<" ";
}
return 0;
}