牛客13279题解:基于广度优先搜索(BFS)计算树高度的算法优化与代码实现
一、题目解读
牛客13279题要求计算给定树的高度。树由n个节点组成,通过n-1条边连接,形成一棵有根树。题目核心在于高效求解树的高度,即从根节点到最深叶子节点的最长路径长度。需要理解树的结构特点,选择合适的算法策略。
二、解题思路
采用广度优先搜索(BFS)解题。BFS通过队列逐层遍历树节点,天然适合计算层级结构。从根节点开始,逐层扩展子节点,每遍历完一层高度递增,最终得到树的高度。该解法时间复杂度为O(n),空间复杂度O(n),适用于大规模数据。
三、解题步骤
1. 初始化队列,根节点入队。
2. 使用while循环,当队列非空时:
○ 记录当前层节点数量(levelSize)。
○ 循环levelSize次,弹出节点并遍历其子节点,子节点入队。
○ 每完成一层遍历,高度+1。
3. 返回最终高度。
四、代码与注释
#include <iostream> #include <vector> #include <queue> using namespace std; int computeHeightBFS(const vector<vector<int>>& tree) { if (tree.empty()) return 0; // 空树高度为0 queue<int> q; q.push(0); // 根节点入队 int height = 0; while (!q.empty()) { int levelSize = q.size(); // 记录当前层节点数 while (levelSize--) { int node = q.front(); q.pop(); for (int child : tree[node]) { // 遍历子节点 q.push(child); } } height++; // 完成一层,高度+1 } return height; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; vector<vector<int>> tree(n); for (int i = 0; i < n - 1; ++i) { int parent, child; cin >> parent >> child; tree[parent].push_back(child); // 构建树结构 } cout << computeHeightBFS(tree) << endl; return 0; }
五、总结
BFS是求解树高度的经典方法,通过层序遍历避免递归开销,尤其适用于需要快速计算层级关系的场景。代码中通过队列管理节点遍历顺序,利用levelSize优化循环,确保每层节点完全处理后再递增高度。掌握该算法对树结构相关问题(如最短路径、层级统计等)具有重要价值。
原创内容 转载请注明出处