链接
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]