Leetcode|543. 二叉树的直径【笔记】

543. 二叉树的直径【笔记】

链接

https://leetcode-cn.com/problems/diameter-of-binary-tree/

前言

二叉树总离不开递归,就是怎么需要考虑用递归的问题了

题目

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

  • 示例
    给定二叉树
          1
         / \
        2   3
       / \     
      4   5             

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

关键

一棵树的直径 = max(左子树的直径, 右子树的直径, 左子树的深度 + 右子树的深度)

思路1

  • 分治+递归
  • 分治:一棵树的直径 = max(左子树的直径, 右子树的直径, 左子树的深度 + 右子树的深度)
    • 第一种情况对应于最长路径在左子树内部(也就是说最长路径不通过当前根节点)
    • 第二种情况对应于最长路径在右子树内部(也就是说最长路径不通过当前根节点)
    • 第三种情况对应于最长路径通过当前根节点(注意:按定义,深度是节点数,路径是边数,左右子树深度的节点数总和刚好等于经过根节点的路径边数
  • 递归:
    • 上述求直径是一种递归
    • 求树的深度也是一种递归,一棵树的深度 = max(左子树的深度, 右子树的深度) + 1
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def diameterOfBinaryTree(self, root: TreeNode) -> int:
        def traverse(root):
            if not root:
                return 0, 0
            left_dia, left_depth = traverse(root.left)
            right_dia, right_depth = traverse(root.right)
            return max(left_dia, right_dia, left_depth+right_depth), max(left_depth, right_depth)+1
        return traverse(root)[0]

疑问

参考

[1] Pythonic极简代码(一共7行),分治 + 递归,一次遍历完成

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值