Diameter of Binary Tree

# 問題

次のように定義される二分木を考える.

1
2
3
4
5
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

二分木の直径を計算せよ.

# 解法

二分木を根を中心に左右に引っ張るイメージをすると直径は左右の部分木の深さの和+1であることがわかる.木の深さは再帰関数で計算できる.

二分木の直径は左右の深さの和+1

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# 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: Optional[TreeNode]) -> int:
        diameter = 0

        def depth(root):
            nonlocal diameter
            if root is None:
                return 0
            left_depth = depth(root.left)
            right_depth = depth(root.right)
            diameter = max(diameter, left_depth + right_depth)
            return 1 + max(left_depth, right_depth)
        depth(root)
        return diameter

# 出典

Hugo で構築されています。
テーマ StackJimmy によって設計されています。