当前位置: 首页 > article >正文

C++算法练习-day29——104.二叉树的最大深度

题目来源:. - 力扣(LeetCode)

题目思路分析

给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。有两种常见的方法来解决这个问题:递归方法和广度优先搜索(BFS)方法。

  1. 递归(深度优先搜索(DFS))方法
    • 如果根节点为空,则深度为0。
    • 否则,递归地计算左子树和右子树的最大深度,然后取两者中的较大值,并加1(加上根节点)。
  2. 广度优先搜索(BFS)方法
    • 使用一个队列来进行层次遍历。
    • 将根节点入队。
    • 初始化深度计数器为0。
    • 当队列不为空时,进入循环:
      • 获取当前层的节点数(即队列的大小)。
      • 遍历当前层的所有节点,并将它们的子节点(如果存在)入队。
      • 每处理完一层,深度计数器加1。
    • 当队列为空时,遍历结束,返回深度计数器的值。

代码:

递归(深度优先搜索(DFS))方法

/**  
 * Definition for a binary tree node.  
 * struct TreeNode {  
 *     int val;  
 *     TreeNode *left;  
 *     TreeNode *right;  
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}  
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}  
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}  
 * };  
 */  
class Solution {  
public:  
    int maxDepth(TreeNode* root) {  
        // 如果根节点为空,返回深度0  
        // 否则,递归计算左右子树的最大深度,并取较大值加1  
        return !root ? 0 : max(maxDepth(root->left), maxDepth(root->right)) + 1;  
    }  
};

广度优先搜索(BFS)方法

/**  
 * Definition for a binary tree node. (Same as above, omitted for brevity)  
 */  
class Solution {  
public:  
    int maxDepth(TreeNode* root) {  
        // 如果根节点为空,返回深度0  
        if (!root) {  
            return 0;  
        }  
          
        // 使用队列进行层次遍历  
        queue<TreeNode*> Q;  
        Q.push(root);  
          
        // 初始化深度计数器  
        int ans = 0;  
          
        // 当队列不为空时,继续遍历  
        while (!Q.empty()) {  
            int sz = Q.size(); // 获取当前层的节点数  
              
            // 遍历当前层的所有节点  
            while (sz > 0) {  
                TreeNode* p = Q.front(); // 取出队列头部的节点  
                Q.pop(); // 从队列中移除该节点  
                  
                // 如果左子节点存在,将其入队  
                if (p->left) {  
                    Q.push(p->left);  
                }  
                  
                // 如果右子节点存在,将其入队  
                if (p->right) {  
                    Q.push(p->right);  
                }  
                  
                sz--; // 减少当前层的节点计数器  
            }  
              
            // 每处理完一层,深度计数器加1  
            ++ans;  
        }  
          
        // 返回深度计数器的值  
        return ans;  
    }  
};

知识点摘要

  • 二叉树:一种树形数据结构,其中每个节点最多有两个子节点(左子节点和右子节点)。
  • 递归:一种在函数内部调用自身的编程技巧,常用于解决可以分解为相似子问题的问题。
  • 深度优先搜索(DFS):深度优先搜索(DFS)是一种图搜索算法,通过递归或栈实现,沿着图的深度方向尽可能搜索,直到找到目标或遍历完所有顶点。它适用于图遍历、路径查找、连通性检测等多种应用场景。
  • 广度优先搜索(BFS):一种图搜索算法,从起始节点开始,首先访问所有相邻节点,然后对每个相邻节点重复此过程。
  • 队列:一种先进先出(FIFO)的数据结构,常用于层次遍历和广度优先搜索。

通过递归和广度优先搜索两种方法,我们可以有效地计算二叉树的最大深度。递归方法简洁明了,通过递归地计算左右子树的最大深度来得到整个树的最大深度。广度优先搜索方法则通过层次遍历整个树,逐层计算深度,直到遍历完所有节点。这两种方法各有优缺点,递归方法实现简单但可能导致栈溢出(对于非常深的树),而广度优先搜索方法则使用额外的空间来存储队列中的节点,但避免了递归的深度限制。在实际应用中,可以根据具体情况选择最适合的方法。


http://www.kler.cn/a/374166.html

相关文章:

  • MySql根据经纬度查询距离
  • python【数据结构】
  • 这是什么操作?强制迁移?GitLab 停止中国区用户访问
  • 丢帧常见的几种处理方法
  • Apache Traffic存在SQL注入漏洞(CVE-2024-45387)
  • 高山旅游景区有效降低成本,无人机山下到山上物资吊运技术详解
  • Java基础3-字符串及相关操作
  • 使用正则表达式验证积累
  • springSecurity入门(5.7版本之前)
  • 各种语言的列表推导式与三元?表达式,C++,python,rust,swift,go
  • ubuntu20.04 加固方案-设置重复登录失败后锁定时间限制
  • flutter_vscode常用快捷键
  • Spring Boot租房管理系统:功能实现与优化
  • 美团嵌入式面试题及参考答案(无人机团队)
  • 云-转录组平台升级解锁更多实用交互式功能
  • 【React 的理解】
  • java小白到架构师技术图谱
  • 流媒体转发服务器的应用场景与原理
  • Linux——五种IO模型
  • linux命令之top(Linux Command Top)
  • day14:RSYNC同步
  • 第72期 | GPTSecurity周报
  • 书生-第四期闯关:完成SSH连接与端口映射并运行hello_world.py
  • 如何使用 Vue CLI 创建 Vue 项目?
  • Java迭代器:深入理解与应用
  • 二百七十四、Kettle——ClickHouse中对错误数据表中进行数据修复(实时)