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

LeetCode 力扣热题100 二叉树的直径

class Solution {
public:// 定义一个变量 `maxd`,用于存储当前二叉树的最大直径。int maxd = 0; // 主函数,计算二叉树的直径。int diameterOfBinaryTree(TreeNode* root) {// 调用 `maxDepth` 函数进行递归计算,并更新 `maxd`。maxDepth(root);// 返回计算得到的最大直径。return maxd;}// 定义 `maxDepth` 函数,计算二叉树的深度,同时更新直径。public:int maxDepth(TreeNode* root) {// 如果当前节点为空,则返回深度为 0。if (root == nullptr) {return 0;}// 递归计算左子树的深度。int l_depth = maxDepth(root->left);// 递归计算右子树的深度。int r_depth = maxDepth(root->right);// 更新最大直径:通过当前节点的左右子树深度之和来计算路径长度。maxd = max(l_depth + r_depth, maxd);// 返回当前节点的最大深度(左右子树深度的最大值 + 当前节点)。return max(l_depth, r_depth) + 1;}
};

假设我们有一个二叉树如下:

        1

       / \

      2   3

     / \     

    4   5  

运行过程:

1. 初始化阶段:

• maxd = 0

• 调用 diameterOfBinaryTree(root),其中 root 指向节点 1。

2. 递归展开 maxDepth(root)

• 以节点 1 为根,计算左子树和右子树的深度。

左子树递归(以 2 为根):

• 调用 maxDepth(root->left),进入节点 2。

左子树的左子树递归(以 4 为根):

• 调用 maxDepth(root->left->left),进入节点 4。

• 节点 4 的左右子树为空:

• 调用 maxDepth(root->left->left->left) 返回 0。

• 调用 maxDepth(root->left->left->right) 返回 0。

• 通过节点 4 的路径长度为 0 + 0 = 0。

• maxd = max(0, maxd) = 0。

• 返回节点 4 的深度:max(0, 0) + 1 = 1。

左子树的右子树递归(以 5 为根):

• 调用 maxDepth(root->left->right),进入节点 5。

• 节点 5 的左右子树为空:

• 调用 maxDepth(root->left->right->left) 返回 0。

• 调用 maxDepth(root->left->right->right) 返回 0。

• 通过节点 5 的路径长度为 0 + 0 = 0。

• maxd = max(0, maxd) = 0。

• 返回节点 5 的深度:max(0, 0) + 1 = 1。

回到节点 2:

• 左子树深度为 1(节点 4)。

• 右子树深度为 1(节点 5)。

• 通过节点 2 的路径长度为 1 + 1 = 2。

• maxd = max(2, maxd) = 2。

• 返回节点 2 的深度:max(1, 1) + 1 = 2。

右子树递归(以 3 为根):

• 调用 maxDepth(root->right),进入节点 3。

• 节点 3 的左右子树为空:

• 调用 maxDepth(root->right->left) 返回 0。

• 调用 maxDepth(root->right->right) 返回 0。

• 通过节点 3 的路径长度为 0 + 0 = 0。

• maxd = max(0, maxd) = 2。

• 返回节点 3 的深度:max(0, 0) + 1 = 1。

回到节点 1:

• 左子树深度为 2(节点 2)。

• 右子树深度为 1(节点 3)。

• 通过节点 1 的路径长度为 2 + 1 = 3。

• maxd = max(3, maxd) = 3。

• 返回节点 1 的深度:max(2, 1) + 1 = 3。

结果:

• 最终,maxd = 3,表示二叉树的最大直径为 3。

• 返回值为 3。

递归总结:

• 每次递归调用时,我们计算左右子树的深度,并利用它们更新全局变量 maxd。

• maxDepth 返回的是当前节点的深度,而 maxd 更新的是路径长度(左深度 + 右深度)。

http://www.lryc.cn/news/526181.html

相关文章:

  • 【图文详解】lnmp架构搭建Discuz论坛
  • 小哆啦解题记:整数转罗马数字
  • 【Java数据结构】排序
  • 我的求职之路合集
  • 数据结构(四) B树/跳表
  • Arcgis国产化替代:Bigemap Pro正式发布
  • LBS 开发微课堂|AI向导接口服务:重塑用户的出行体验
  • AI导航工具我开源了利用node爬取了几百条数据
  • openstack单机安装
  • Vue3实现小红书瀑布流布局任意组件动态更新页面方法实践
  • 深度学习项目--基于LSTM的糖尿病预测探究(pytorch实现)
  • Next.js 实战 (十):中间件的魅力,打造更快更安全的应用
  • python+playwright自动化测试(四):元素操作(键盘鼠标事件)、文件上传
  • 【论文+源码】Diffusion-LM 改进了可控文本生成
  • 双目立体校正和Q矩阵
  • vscode 自用插件
  • OpenCV:在图像中添加高斯噪声、胡椒噪声
  • DuckDB:Golang操作DuckDB实战案例
  • MySQL入门(数据库、数据表、数据、字段的操作以及查询相关sql语法)
  • kotlin的协程的基础概念
  • Spring--SpringMVC使用(接收和响应数据、RESTFul风格设计、其他扩展)
  • 隐藏php版本信息x-powered-by
  • 哈夫曼树(构建、编码、译码)(详细分析+C++代码实现)
  • C++ 二叉搜索树
  • docker构建Java项目镜像常用的Java版本,国内私有仓库公网快速下载,解决从docker.io无法下载的问题
  • 低代码系统-氚云、简道云表单控件对比
  • 为什么IDEA提示不推荐@Autowired❓️如果使用@Resource呢❓️
  • Unity在WebGL中拍照和录视频
  • 爬虫基础之爬取某站视频
  • mongoDB常见指令