第三部分 數據結構 --樹-1336:【例3-1】找樹根和孩子

1336:【例3-1】找樹根和孩子

時間限制: 1000 ms 內存限制: 65536 KB
提交數: 6553 通過數: 3384
【題目描述】
給定一棵樹,輸出樹的根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


思路:數據結構 樹`找出根節點,根節點肯定沒有父節點,所以父節點爲0的點就是根節點。找出孩子最多的節點,二重循環遍歷所有的節點,如果某個子結點存儲的父節點等於一層循環遍歷的數,說明二層循環遍歷的數是一層循環遍歷的數的父節點,子節點數++,最大的節點爲maxroot,打印結果,如果父節點爲maxroot,則子結點爲最多的那個.
在這裏插入圖片描述

#include<cstdio>
#include<iostream>
using namespace std;
int n,m,tree[101]={0};
int main(){
	int i,j,x,y,root,maxroot, ans = 0,maxn = 0;
	cin >> n >> m;
	for(i = 1; i <= m;i++){
		cin >> x >> y;
		tree[y] = x;//讀入數據,樹的特點:每一個節點都只有唯一的前驅元素,所以用數組來的存儲每個子節點的父節點。
	}
	for(i = 1; i <= n; i++){//找出根節點,根節點肯定沒有父節點,所以父節點爲0的點就是根節點。
		if(tree[i] == 0)
		{
			root = i;
			break;
		}
	}
	for(i = 1; i <= n; i++)//找出孩子最多的節點,二重循環遍歷所有的節點,如果某個子結點存儲的父節點等於一層循環遍歷的數,說明二層循環遍歷的數是一層循環遍歷的數的父節點,子節點數++,最大的節點爲maxroot
	{
		ans = 0;
		for(j = 0 ; j <= n; j++)
		{
			if(tree[j] == i)
			ans++;
		}
		if(ans > maxn)
		{
			maxn = ans;
			maxroot = i;
		}
	}
	cout << root << endl << maxroot << endl; 
	for(i = 1; i <= n; i++)//打印結果,如果父節點爲maxroot,則子結點爲最多的那個
	{
		if(tree[i] == maxroot) 
		cout << i <<' ';
	}
	
	return 0;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章