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

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

  • 链接
  • 前言
  • 题目
  • 关键
  • 思路1
  • 疑问
  • 参考

链接

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行),分治 + 递归,一次遍历完成

你可能感兴趣的:(Leetcode,二叉树,算法,数据结构,leetcode,python)