牛客13279题解:利用递归与深度优先搜索计算树的最大高度(附完整代码)

贾蔷
• 阅读 3

牛客13279题解:利用递归与深度优先搜索计算树的最大高度(附完整代码)

一、题目解读 牛客13279题要求计算给定树的最大高度。题目输入一棵以邻接表形式表示的树(节点从0开始编号),需要输出从根节点到最深叶节点的最长路径长度。树的结构由n个节点和n-1条边构成,保证为连通无环图。理解题目核心在于准确获取树的拓扑关系,并设计算法遍历各分支寻找最长路径。

二、解题思路 代码采用递归+深度优先搜索(DFS)策略。主函数通过邻接表构建树结构后,从根节点(索引0)出发递归计算:

  1. 对每个子节点递归调用computeHeight(),获取其子树高度;

  2. 取所有子树高度的最大值,并加1(当前节点自身高度);

  3. 最终返回根节点的高度即为整树最大高度。

此思路利用递归天然适配树结构的特点,简洁高效。

三、解题步骤 步骤1:输入处理与树构建

读取节点数n,初始化邻接表tree(vector<vector>);

循环n-1次,输入父节点parent和子节点child,将child加入parent的邻接表列表。

步骤2:递归计算高度

computeHeight()函数接收树和当前节点node:

遍历node所有子节点,递归调用自身获取子树高度;

用max()函数更新当前最高值,最终返回maxHeight+1。

步骤3:主函数输出结果

调用computeHeight(tree, 0)计算根节点高度并输出。

四、代码和注释

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

// 递归计算以node为根的子树高度
int computeHeight(const vector<vector<int>>& tree, int node) {
    int maxHeight = 0;  // 初始化当前子树最大高度为0
    for (int child : tree[node]) {  // 遍历node的所有子节点
        maxHeight = max(maxHeight, computeHeight(tree, child));  // 递归计算子树高度并取最大值
    }
    return maxHeight + 1;  // 当前节点高度=子树最高高度+1
}

int main() {
    ios::sync_with_stdio(false);  // 加快输入/输出速度
    cin.tie(nullptr);            // 取消与cout的同步

    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 << computeHeight(tree, 0) << endl;  // 计算根节点0的高度并输出
    return 0;
}

五、总结 本解法通过递归天然匹配树结构,避免了复杂的层次遍历或栈操作。时间复杂度为O(n),空间复杂度为O(n)(递归栈深度)。适用于中小型树结构高度计算场景。需注意输入数据需严格保证为树,避免环导致递归无限循环。代码简洁性、可读性与效率平衡良好,是解决此类问题的经典范式。

来源:牛客13279题解:利用递归与深度优先搜索计算树的最大高度(附完整代码)

点赞
收藏
评论区
推荐文章
九路 九路
4年前
前端学数据结构与算法:二叉树的四种遍历方式及其应用
前言上一章我们从0到1的实现了一颗二叉搜索树,以及理解了二叉搜索树的特性与基本操作,这一章介绍关于二叉树的更多操作,也就是树的遍历,对树的每个节点进行访问。主要包括前序遍历、中序遍历、后序遍历、层序遍历,前面三种也叫深度优先遍历(DFS),最后的层序遍历也叫广度优先遍历(BFS),理解这四种遍历方式的不同,再遇到树相关的算法问题时,也就能更加游刃有余。这
Stella981 Stella981
3年前
LeetCode(110):平衡二叉树
Easy!题目描述:给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树_每个节点_的左右两个子树的高度差的绝对值不超过1。示例1:给定二叉树 3,9,20,null,null,15,73/\920/
Wesley13 Wesley13
3年前
Java数据结构和算法(十五)——无权无向图
前面我们介绍了树这种数据结构,树是由n(n0)个有限节点通过连接它们的边组成一个具有层次关系的集合,把它叫做“树”是因为它看起来像一棵倒挂的树,包括二叉树、红黑树、234树、堆等各种不同的树,有对这几种树不了解的可以参考我前面几篇博客。而本篇博客我们将介绍另外一种数据结构——图,图也是计算机程序设计中最常用的数据结构之一,从数学意义上讲
Wesley13 Wesley13
3年前
C语言递归之二叉树的最小深度
https://www.cnblogs.com/shichampion/p/12262678.html题目描述给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明: 叶子节点是指没有子节点的节点。示例输入:3,9,20,null,null,15,7
Stella981 Stella981
3年前
LeetCode112
非商业,LeetCode链接附上:https://leetcodecn.com/problems/pathsum/进入正题。题目:给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。说明: 叶子节点是指没有子节点的节点。示例:给定如下二叉树,以及目标和
深度学习 深度学习
7小时前
洛谷1111题解:基于Kruskal算法与并查集的最小生成树实现
一、题目解读洛谷1111题是一道经典的图论问题,要求构建一个无向图的最小生成树,并输出其最大边权值。题目核心在于通过给定的边集合,找到连接所有节点的最小权值子集,同时保证无环。这通常涉及最小生成树算法(如Kruskal)的应用,需要高效处理边权重与节点连通
贾蔷 贾蔷
1个月前
力扣145题:二叉树的后序遍历, 解题思路与C++实现
题目介绍力扣第145题要求实现一个函数,该函数接收一个二叉树的根节点,并返回该树的后序遍历结果。后序遍历是一种遍历二叉树的算法,其顺序为:先遍历左子树,是右子树,是根节点。解题思路分析解题时,我们可以使用递归或迭代的方法。递归方法较为直观,但可能导致栈溢出
贾蔷 贾蔷
7小时前
牛客12576题全解析:动态规划+质因数分解解决跳跃问题
一、题目解读牛客12576题是一道经典的算法题,要求给定起点N和终点M,求解从N到M的最少跳跃次数。题目考察的核心在于路径优化与动态规划思想,需结合数论中的质因数分解技巧,通过合理设计算法降低时间复杂度,避免暴力枚举的指数级耗时。二、解题思路采用“动态规划
贾蔷 贾蔷
7小时前
【蓝桥杯2015省赛解析】生命之树(洛谷P8625):树形DP解题全攻略
一、题目解读“生命之树”是一道经典的树形结构问题,要求计算一棵带权树中,以某个节点为根的最大子树权值和。题目输入为n个节点及边信息,每个节点有权值wi,需找到所有节点中,子树权值和最大的节点,并输出其值。核心挑战在于如何处理树形结构的递归关系,并高效聚合子
深度学习 深度学习
7小时前
【CSP-S 2019】括号树(洛谷P5658):栈+DFS
一、题目解读括号树问题(洛谷P5658)要求处理一个由括号序列转化的树结构:每个节点表示一个括号,'('为子节点,')'为父节点。题目给定一棵n个节点的树,需计算每个节点的深度(括号层数),并输出所有节点深度与节点编号乘积的异或和。核心在于将括号序列转化为