算法笔记练习 9.3 树的遍历 问题 B: 树的高度

算法笔记练习 题解合集

本题链接

题目

题目描述
一棵树有n个节点,其中1号节点为根节点。

输入
第一行是整数n,表示节点数
后面若干行,每行两个整数a b,表示b是a的子节点。

输出
求这棵树的高度(根节点为第1层)

样例输入

5
1 2
1 3
3 4
3 5

样例输出

3

思路

用二维vector来存储这颗树,二维vector中的每一个一维vector代表一个结点,一维vector中下标 0 的值表示这个结点所在的层次,下标大于 0 的所有值(若存在的话)代表这个结点的所有孩子结点。

把所有数据接收之后用 BFS 跑一遍就能得到最大层数了~

代码

#include 
#include  
#include 
using namespace std;

int BFS(vector<vector<int> >& tree) {
	int level;
	queue<int> Q;
	Q.push(1);
	while (!Q.empty()) {
		int top = Q.front();
		Q.pop();
		if (tree[top].size() > 1) {
			for (int i = 1; i < tree[top].size(); ++i) {
				Q.push(tree[top][i]);
				level = tree[tree[top][i]][0] = tree[top][0] + 1;
			} 
		} 
	} 
	return level + 1;
} 

int main() {
	int n, parent, child;
	scanf("%d", &n);
	vector<vector<int> > tree(n + 1, {0});
	while (scanf("%d%d", &parent, &child) != EOF)
		tree[parent].push_back(child);
	printf("%d\n", BFS(tree));
	return 0;
} 

你可能感兴趣的:(算法笔记)