博客
关于我
leetcode【简单】543、二叉树的直径
阅读量:730 次
发布时间:2019-03-21

本文共 1325 字,大约阅读时间需要 4 分钟。

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

错误的思考方式

初步的错误想法是直接将左右子树的高度相加,以此得到直径长度。然而,这种方法并不总是正确,因为树中可能存在一条路径,这条路径并不经过根节点,而这一条路径的长度可能比左右子树高度之和更长。

正确的思路与递归公式

正确的思路是将每个节点都视为根节点,分别计算这棵以该节点为根的树的直径长度,然后取最大的那个值作为当前树的直径长度。

递归公式为:

  • 直径 = max(左子树的直径, 右子树的直径, 左子树高度 + 右子树高度)

这个递归公式考虑了如果路径穿过根节点以及不穿过根节点的情况。每次递归返回后,更新全局最大直径。因此,正确的直径长度是所有这些情况中的最大值。

实现方法

使用递归遍历整棵树,每次计算当前节点的左右子树的直径长度,同时计算高度,然后比较并维护一个堆的最大值。在递归返回时,更新全局最大直径值。

代码实现

class TreeNode:    def __init__(self, val=0, left=None, right=None):        self.val = val        self.left = left        self.right = rightclass Solution:    def diameterOfBinaryTree(self, root:TreeNode) -> int:        maxd = [0]  # 使用闭包包装,避免变量修改问题        def dfs(node):            if not node:                return 0            left = dfs(node.left)            right = dfs(node.right)            if left + right > maxd[0]:                maxd[0] = left + right            # 返回当前树的高度            return max(left, right) + 1        dfs(root)        return maxd[0]

代码解释

  • TreeNode类:用于定义二叉树的节点,包含值、左子树和右子树属性。
  • Solution类:处理二叉树直径计算的逻辑。
  • diameterOfBinaryTree:函数接收根节点,返回整棵树的直径长度。
  • maxd数组:用于维护全局最大直径。
  • dfs函数:递归计算当前子树的直径和高度。
  • 递归逻辑
    • 基本情况:If node为空,返回0。
    • 递归调用:计算左、右子树的直径和高度。
    • 更新maxd:比较左+右高度和当前maxd,更新最大值。
    • 返回高度:当前子树的高度是左、高右或其一加一,表示树的高度。
  • 主函数:调用dfs函数并返回maxd的值。
  • 总结

    这个递归方法确保每个可能的路径都被考量,无论路径是否经过根节点,最终返回的maxd是正确的直径长度。

    转载地址:http://ptlrz.baihongyu.com/

    你可能感兴趣的文章
    Navicate for mysql 数据库设计-数据库分析
    查看>>
    Navicat下载和破解以及使用
    查看>>
    Navicat中怎样将SQLServer的表复制到MySql中
    查看>>
    navicat创建连接 2002-can‘t connect to server on localhost(10061)且mysql服务已启动问题
    查看>>
    Navicat可视化界面导入SQL文件生成数据库表
    查看>>
    Navicat向sqlserver中插入数据时提示:当 IDENTITY_INSERT 设置为 OFF 时,不能向表中的标识列插入显式值
    查看>>
    Navicat因导入的sql文件中时间数据类型有参数而报错的原因(例:datetime(3))
    查看>>
    Navicat如何连接MySQL
    查看>>
    navicat怎么导出和导入数据表
    查看>>
    Navicat(数据库可视化操作软件)安装、配置、测试
    查看>>
    ndk特定版本下载
    查看>>
    NDK编译错误expected specifier-qualifier-list before...
    查看>>
    Neat Stuff to Do in List Controls Using Custom Draw
    查看>>
    Necurs僵尸网络攻击美国金融机构 利用Trickbot银行木马窃取账户信息和欺诈
    查看>>
    NeHe OpenGL教程 07 纹理过滤、应用光照
    查看>>
    NeHe OpenGL教程 第四十四课:3D光晕
    查看>>
    Neighbor2Neighbor 开源项目教程
    查看>>
    neo4j图形数据库Java应用
    查看>>
    Neo4j图数据库_web页面关闭登录实现免登陆访问_常用的cypher语句_删除_查询_创建关系图谱---Neo4j图数据库工作笔记0013
    查看>>
    Neo4j图数据库的介绍_图数据库结构_节点_关系_属性_数据---Neo4j图数据库工作笔记0001
    查看>>