300x250
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- DFS
- 리눅스
- 코딩테스트
- 구글 킥스타트
- 그래프
- 파이썬
- 코딩
- 딥러닝
- 백준
- CSS
- 프로그래머스
- 브루트포스
- BFS
- kick start
- OS
- 운영체제
- nlp
- dp
- 동적프로그래밍
- 알고리즘
- google coding competition
- 코딩 테스트
- AI
- 순열
- PYTHON
- 동적 프로그래밍
- 프로그래밍
- linux
- 킥스타트
- 네트워크
Archives
- Today
- Total
오뚝이개발자
트리 순회(Tree traversal) 두 가지 구현 방법(재귀, 반복문) 본문
728x90
300x250
트리를 순회하는 방법은 preorder, inorder, postorder로 크게 3가지가 있다. 여기서 소개하려고 하는 내용은 이러한 순회를 "어떻게" 구현하는지에 관한 것이다. 가장 보편적인 것은 물론 재귀를 이용하는 것이나, 반복문을 통해서도 얼마든지 구현 가능하다.
참고로 트리노드의 정의는 아래와 같다고 하자.
# 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
편의상 inorder를 구현하는 것으로 한다.
재귀(Recursive)를 통한 구현
class Solution:
# Recursive
def recurse(self, node, ans):
if not node:
return
if node.left:
self.recurse(node.left, ans)
ans.append(node.val)
if node.right:
self.recurse(node.right, ans)
def inorderTraversal(self, root: TreeNode) -> List[int]:
ans = []
self.recurse(root, ans)
return ans
반복문(Iterative)을 통한 구현
반복문을 통한 구현은 stack을 사용하면 된다. 아래와 같은 트리를 inorder로 탐색하려고 한다.
이 때, stack의 상태는 아래와 같다. stack에서 pop해줄 때마다 읽어들인다. ans에 표시한 리스트가 바로 pop해줄 때마다 읽어들이는 것을 나타낸 것이다.
class Solution:
# Iterative
def inorderTraversal(self, root: TreeNode) -> List[int]:
ans = []
stack = [root]
visit = [root]
if root:
while stack:
x = stack[-1]
if x.left and x.left not in visit:
stack.append(x.left)
if not x.left or x.left in visit:
ans.append(x.val)
visit.append(x)
stack.pop()
if x.right:
stack.append(x.right)
return ans
else:
return []
관련문제
728x90
300x250
'코딩 테스트 > 리트코드' 카테고리의 다른 글
3Sum (0) | 2021.07.24 |
---|---|
Integer to Roman (0) | 2021.07.17 |
파이썬 문자열 정렬, 문자열 리스트 정렬, anagram 찾기 (0) | 2021.01.14 |
linked list 정렬하기 (0) | 2021.01.03 |
Finding Anagrams(anagram 찾기) (0) | 2021.01.03 |
Comments