当前位置:首页 > 牛客 > 牛客13279题解:基于广度优先搜索(BFS)计算树高度的算法优化与代码实现

牛客13279题解:基于广度优先搜索(BFS)计算树高度的算法优化与代码实现

7小时前

牛客13279题解:基于广度优先搜索(BFS)计算树高度的算法优化与代码实现 广搜 广度优先搜索 BFS算法 牛客题解 层序遍历 树结构 第1张

一、题目解读

牛客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优化循环,确保每层节点完全处理后再递增高度。掌握该算法对树结构相关问题(如最短路径、层级统计等)具有重要价值。

原创内容 转载请注明出处

分享给朋友:

相关文章

洛谷4554题解:BFS算法优化最短路径求解(附代码详解)

洛谷4554题解:BFS算法优化最短路径求解(附代码详解)

一、题目解读洛谷4554题要求在一个n×m的网格中,计算从点(x1,y1)到点(x2,y2)的最短路径距离。路径上的每个格子包含字符,若相邻格子字符不同,则需要额外步数。题目核心在于处理字符差异对路径...

牛客14496题解:括号最大深度问题(栈思想与代码优化)

牛客14496题解:括号最大深度问题(栈思想与代码优化)

一、题目解读牛客14496题要求计算给定括号字符串中的最大深度。例如,对于字符串 "(()())",最大深度为2。题目考察对括号嵌套结构的理解,以及如何通过编程找到最深嵌套层次。二...

洛谷1363题解法:虚拟坐标优化BFS解决循环迷宫问题(附代码详解)

洛谷1363题解法:虚拟坐标优化BFS解决循环迷宫问题(附代码详解)

一、题目解读洛谷1363题要求判断在给定大小的循环迷宫中,从起点出发是否可以通过移动到达多个不同的路径方向。迷宫由字符矩阵表示,'S'为起点,'#'为障碍物,其余为可通...

牛客232639题解析:双指针+排序算法高效求解三角形数量(附代码详解)

牛客232639题解析:双指针+排序算法高效求解三角形数量(附代码详解)

一、题目解读牛客232639题要求计算一个整数数组中能够组成有效三角形的三边组合数量。根据三角形不等式,三边需满足任意两边之和大于第三边。例如,数组[3, 4, 5, 6]可组成两个有效三角形([3,...

牛客4432题解题全解析:矩阵快速幂优化楼梯攀登问题(附C++代码)

牛客4432题解题全解析:矩阵快速幂优化楼梯攀登问题(附C++代码)

一、题目解读牛客4432题要求计算在n阶楼梯中,每次可爬1阶或2阶,共有多少种不同的攀登方式。该问题属于经典的动态规划类题目,需通过数学递推或矩阵乘法优化算法以应对较大数据规模。题目核心在于寻找高效计...

牛客4577题解:滑动窗口解法

牛客4577题解:滑动窗口解法

一、题目解读牛客4577题要求处理多组测试数据,每组包含一个整数数组crimes和两个参数n(数组长度)、t(阈值)、c(窗口大小)。题目需要统计数组中所有长度恰好为c的子数组,其元素和不超过t的数量...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。