Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions 0199.Binary-Tree-Right-Side-View/memo.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# 199. Binary Tree Right Side View

## step1

右の子を先に処理するin-orderで書ける。8mぐらい。

nonlocal をつけずに一度間違えた。変数のスコープを意識できていないためなので反省。

Mediumの問題の中ではスラスラと解けた方だと思う。

## step2
pre-order, bfsでも書ける。nonlocalな変数が不要になる。MAX_NODESも不要になるのでこちらが良さそう。

その他、これ以降これ以降以下のように型を意識していきたい。
- List[] -> list[]と書き直す
- 空のコンテナには型をつける
- 関数にも型をつける


### 他の人のコード
https://github.com/huyfififi/coding-challenges/pull/55

上書きするようにすれば左を先に処理するpre-order, bfsでも書ける。




34 changes: 34 additions & 0 deletions 0199.Binary-Tree-Right-Side-View/step1.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
from typing import Optional


# 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


MAX_NODES = 100


class Solution:
def rightSideView(self, root: Optional[TreeNode]) -> list[int]:
if root is None:
return []

result = [-1] * MAX_NODES
max_depth = 0

def traverse_right_first(node: Optional[TreeNode], depth: int) -> None:
nonlocal max_depth
if node is None:
return
traverse_right_first(node.right, depth + 1)
if result[depth] == -1:
result[depth] = node.val
max_depth = max(max_depth, depth)
traverse_right_first(node.left, depth + 1)

traverse_right_first(root, 0)
return result[: max_depth + 1]
35 changes: 35 additions & 0 deletions 0199.Binary-Tree-Right-Side-View/step2_bfs.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
from typing import Optional


# 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 rightSideView(self, root: Optional[TreeNode]) -> list[int]:
if root is None:
return []

result: list[int] = []
frontier = [root]
depth = 0

while frontier:
next_frontier: list[Optional[TreeNode]] = []

for node in frontier:
if node is None:
continue
if len(result) == depth:
result.append(node.val)
next_frontier.append(node.right)
next_frontier.append(node.left)

frontier = next_frontier
depth += 1

return result
31 changes: 31 additions & 0 deletions 0199.Binary-Tree-Right-Side-View/step2_bfs_back.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
from typing import Optional


# 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 rightSideView(self, root: Optional[TreeNode]) -> list[int]:
if root is None:
return []

result: list[int] = []
frontier = [root]

while frontier:
result.append(frontier[-1].val)

next_frontier: list[TreeNode] = []
for node in frontier:
if node.left is not None:
next_frontier.append(node.left)
if node.right is not None:
next_frontier.append(node.right)
frontier = next_frontier

return result
30 changes: 30 additions & 0 deletions 0199.Binary-Tree-Right-Side-View/step2_preorder.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
from typing import Optional


# 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 rightSideView(self, root: Optional[TreeNode]) -> list[int]:
if root is None:
return []

result = []

def traverse(node: Optional[TreeNode], depth: int) -> None:
if node is None:
return

if len(result) == depth:
result.append(node.val)

traverse(node.right, depth + 1)
traverse(node.left, depth + 1)

traverse(root, 0)
return result
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
from typing import Optional


# 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 rightSideView(self, root: Optional[TreeNode]) -> list[int]:
if root is None:
return []

result: list[int] = []

def traverse_and_store_rightmost(node: Optional[TreeNode], depth: int) -> None:
if node is None:
return
if depth < len(result):
result[depth] = node.val
else:
result.append(node.val)
traverse_and_store_rightmost(node.left, depth + 1)
traverse_and_store_rightmost(node.right, depth + 1)

traverse_and_store_rightmost(root, 0)
return result