Given the root
of a binary tree, imagine yourself standing on the right side of it, return the values of the nodes you can see ordered from top to bottom.
[0, 100]
.-100 <= Node.val <= 100
# 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]:
보기 코드의 트리 구조의 루트 노드 root
가 주어집니다.
트리를 구조화한 모습을 오른쪽에서 바라볼 때 보이는 값들을 루트노드 위치부터 순서대로 리스트로 반환하는 문제입니다.
제가 생각한 코드는 다음과 같습니다.
# 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 == None:
return []
check_depth = 0
stack = [(root,0)]
val_list = []
while stack:
node,now_depth = stack.pop()
if now_depth == check_depth:
val_list.append(node.val)
check_depth+=1
if node.left:
stack.append((node.left,now_depth+1))
if node.right:
stack.append((node.right,now_depth+1))
return val_list
stack
: 노드를 순회하기 위해 노드를 저장하는 리스트입니다. 노드와 깊이 튜플을 원소로 가집니다. (루트노트,0)
으로 초기화합니다check_depth
: 탐색해야 하는 노드의 깊이 정수값입니다.val_list
: 반환할 값 리스트입니다.val_list
에 저장 후 깊이를 1
만큼 증가시킵니다.깊이 탐색을 하며 오른쪽 노드를 우선으로 해서 값이 chack_depth
의 깊이에서 값이 등장할 때 마다 저장하는 방식입니다.
if문
만 반복된 이유는 조건들 간에 의존관계가 없기 때문입니다.
특정 깊이의 값을 구했다고 다른 노드의 서브트리를 구하지 않으면 다음 층에서 문제가 생깁니다. 그래서 모든 노드를 탐색하며 가야하므로 if문
을 반복해서 사용합니다.
그리고 깊이가 어디서 얼마큼 나타날지 모르기 때문에 전체를 순회하는 방식을 고려해야 하는 점도 있습니다.
모두 순회하면서 오른쪽 값을 표현하는데서 어떤 방식을 사용해야할지 고려해본 문제였습니다.