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

( “树” 之 DFS) 543. 二叉树的直径 ——【Leetcode每日一题】

543. 二叉树的直径

给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。

示例 :

给定二叉树

在这里插入图片描述

返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。

注意 :两结点之间的路径长度是以它们之间边的数目表示。

思路:DFS

注意: 任意两个节点之间的边数都可能是最大直径, 最大的直径不一定包括根节点!

最大值不一定包含根节点,但是一定经过某一个节点;

经过该节点 左右子树的最大高度之和 即为最大直径; 于是,可以使用 DFS,求每个节点左右子树的最大高度之和,取出最大值 maxdia,即为结果:

  • 定义一个全局变量 maxdia,用来记录最大直径, 使用 height(root) 遍历所有的节点,height(root) 的作用是:找出以 root 为根节点的左右子树的最大高度;
  • maxdia 取值为以经过 root为根节点的左右子树的最大高度之和 ,为left + right;
  • root 为左子树或右子树的高度为 Math.max(left, right) + 1, 返回给root的父节点,;
  • 通过递归,找到 maxdia 的最大值.

代码:(Java、C++)

Java

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    private int maxdir = 0;
    public int diameterOfBinaryTree(TreeNode root) {
        if(root == null) return 0;
        height(root);
        return maxdir;
    }
    public int height(TreeNode root){
        if(root == null) return 0;
        int left = height(root.left);
        int right = height(root.right);
        maxdir = Math.max(maxdir, left + right);
        return 1 + Math.max(left, right);
    }
}

C++

/**
 * 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 maxdia = 0;
    int diameterOfBinaryTree(TreeNode* root) {
        if(root == NULL) return 0;
        height(root);
        return maxdia;
    }
    int height(TreeNode* root){
        if(root == NULL) return 0;
        int left = height(root->left);
        int right = height(root->right);
        maxdia = max(maxdia, left + right);
        return 1 + max(left, right);
    }
};

运行结果:

在这里插入图片描述

复杂度分析:

  • 时间复杂度 O ( n ) O(n) O(n),其中 n 为二叉树的节点数,即遍历一棵二叉树的时间复杂度,每个结点只被访问一次。
  • 空间复杂度 O ( H e i g h t ) O(Height) O(Height),其中 Height 为二叉树的高度。由于递归函数在递归过程中需要为每一层递归函数分配栈空间,所以这里需要额外的空间且该空间取决于递归的深度,而递归的深度显然为二叉树的高度,并且每次递归调用的函数里又只用了常数个变量,所以所需空间复杂度为 O ( H e i g h t ) O(Height) O(Height)

题目来源:力扣。

放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我 leetCode专栏,每日更新!

注: 如有不足,欢迎指正!


http://www.kler.cn/news/10235.html

相关文章:

  • Git的安装与基本使用
  • 2021蓝桥杯真题大写 C语言/C++
  • 计算机网络笔记(横向)
  • 代码随想录算法训练营第三十四天-贪心算法3| 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果
  • 微服务+springcloud+springcloud alibaba学习笔记【Eureka服务注册中心】(3/9)
  • C++标准库--IO库(Primer C++ 第五版 · 阅读笔记)
  • 离散数学_第二章:基本结构:集合、函数、序列、求和和矩阵(1)
  • 探索树形数据结构,通识树、森林与二叉树的基础知识(专有名词),进一步利用顺序表和链表表示、遍历和线索树形结构
  • 梯度的看法
  • MyBatis配置文件 —— 相关标签详解
  • 干翻Hadoop系列之:Hadoop前瞻之分布式知识
  • Leetcode.1992 找到所有的农场组
  • NumPy 秘籍中文第二版:十、Scikits 的乐趣
  • vue3+TS+Pinia+Vite项目实战之一
  • 程序员的日常瞎想,个人规划,和企业把控之间的微妙关系。职场人你懂!!
  • WPF MVVM模式构建项目
  • “三步走”推动云原生转型之路
  • Unity资源-音效初识
  • 【MySQL】表的约束
  • Wijmo JavaScript UI 5.20222.877 Crack
  • ESLint的配置
  • 使用向量机(SVM)算法的推荐系统
  • Flutter系列(七)ListView 图文列表详解
  • sourcemap文件泄露漏洞
  • C++开发必知的内存问题及常用的解决方法-经典文章
  • 算法自学__ 莫队
  • 比较系统的学习 pandas (2)
  • 18从零开始学Java之switch分支语句中该怎么用?
  • 【工作感悟】老程序员总结的四条工作经验教训
  • 表格软件界的卷王,Excel、access、foxpro全靠边,WPS:真荣幸