diff --git a/104. Maximum Depth of Binary Tree.md b/104. Maximum Depth of Binary Tree.md new file mode 100644 index 0000000..c336e46 --- /dev/null +++ b/104. Maximum Depth of Binary Tree.md @@ -0,0 +1,87 @@ +1st + +最大深度を求めるので再帰の DFS で解いた。 +ノードの深さは最大 10^4 なので、デフォルトの再帰の設定だと`RecursionError`が発生するので気を付ける必要がある。 +時間計算量:O(n) +空間計算量:O(n) 木がバランスしていれば O(logn)か + +```python +class Solution: + def maxDepth(self, root: Optional[TreeNode]) -> int: + if root is None: + return 0 + + left_depth = self.maxDepth(root.left) + right_depth = self.maxDepth(root.right) + + return max(left_depth, right_depth) + 1 +``` + +2nd +1st とほぼおなじ。if not root に変えただけ。 + +```python +class Solution: + def maxDepth(self, root: Optional[TreeNode]) -> int: + if not root: + return 0 + + left_depth = self.maxDepth(root.left) + right_depth = self.maxDepth(root.right) + + return max(left_depth, right_depth) + 1 +``` + +スタックを用いた DFS。 +再帰と違いスタックオーバーフローを気にしなくてよい。 + +```python +class Solution: + def maxDepth(self, root: Optional[TreeNode]) -> int: + tree_nodes = [] + tree_nodes.append((root, 1)) + max_depth = 0 + while tree_nodes: + node, depth = tree_nodes.pop() + if node is None: + continue + max_depth = max(max_depth, depth) + if node.left: + tree_nodes.append((node.left, depth + 1)) + if node.right: + tree_nodes.append((node.right, depth + 1)) + return max_depth +``` + +BFS。 +木がバランスしていても空間計算量が O(n)のため、今回のケースだと DFS のほうがより効率的になる可能性が高い。 + +```python +class Solution: + def maxDepth(self, root: Optional[TreeNode]) -> int: + tree_nodes = deque([root]) + depth = 0 + while tree_nodes: + level_size = len(tree_nodes) + for _ in range(level_size): + node = tree_nodes.popleft() + if node.left: + tree_nodes.append(node.left) + if node.right: + tree_nodes.append(node.right) + return depth +``` + +3rd + +```python +class Solution: + def maxDepth(self, root: Optional[TreeNode]) -> int: + if root is None: + return 0 + + left_depth = self.maxDepth(root.left) + right_depth = self.maxDepth(root.right) + + return max(left_depth, right_depth) + 1 +```