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

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.mrgr.cn/news/63036.html

相关文章:

  • 计算机毕业设计——ssm基于SSM框架的华建汽车出租系统设计与实现演示录像2021
  • 速盾:海外CDN高防解析.提升网站安全与速度
  • 【AI开源项目】FastGPT- 快速部署FastGPT以及使用知识库的两种方式!
  • 动态威胁场景下赋能企业安全,F5推出BIG-IP Next Web应用防火墙
  • Charles简单压力测试
  • opencv-windows-cmake-Mingw-w64,编译opencv源码
  • C语言 | Leetcode C语言题解之第523题连续的子数组和
  • Podman+Minikube:MacBook 运行 Kubernetes 最佳实践
  • vmvare启动freebsd操作系统密码忘记了怎么办?
  • 哪里可以找到无版权抖音视频素材?
  • lanqiaoOJ 1110:小王子单链表 ← STL list
  • Python | Leetcode Python题解之第524题通过删除字母匹配到字典里最长单词
  • mysql 的内连接、左连接、右连接有什么区别?
  • 3000字帮你彻底搞懂Java抽象类与接口的区别(含JDK8接口新增三种方法与丰富案例)
  • 如何在Ubuntu 18.04上使用uWSGI和Nginx为Flask应用提供服务
  • 【数据结构-邻项消除】力扣1717. 删除子字符串的最大得分
  • 如何找到车在路上行驶的视频素材
  • 数据结构之顺序表(C语言)
  • Java | Leetcode Java题解之第523题连续的子数组和
  • JavaScript实现将阿拉伯数字转换成中文或大写中文
  • 通过软盘拷贝文件
  • 什么是指针数组 和 数组指针
  • antd 5X中 tree属性结构,自定义菜单,右键菜单实现方式
  • 使用Nginx作为反向代理和负载均衡器
  • Linux---cp命令
  • 判断101—200之间有多少个素数,并输出所有素数