18강: 이진 트리(Binary Tree)
이진 트리(Binary Tree)란?
이진 트리의 추상적 자료구조
연산의 정의
- size()
- depth()
순회(traversal, search)
구현
1
2
3
4
5
6
| # Node
class Node:
def __init__(self, item):
self.data = item
self.left = None
self.right = None
|
1
2
3
4
| # Tree
class BinaryTree:
def __init__(self, r):
self.root = r
|
size()
- 재귀적인 방법으로 쉽게 구할 수 있음
- 전체 이진 트리의 size() = left subtree의 size + right subtree의 size +
1(자기 자신)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| class Node:
# 자기 자신이 root인 subtree의 size를 구하는 멤버 메소드
def size(self):
# left subtree
l = self.left.size() if self.left else 0
# right subtree
r = self.right.size() if self.right else 0
return l + r + 1
class BinaryTree:
def size(self):
if self.root:
return self.root.size()
else:
# empty tree
return 0
|
depth()
- 재귀적으로
- 전체 이진 트리의 depth() = left subtree depth 와 right subtree depth
중 더 큰것 + 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| class Node:
def depth(self):
l = self.left.depth() if self.left else 0
r = self.right.depth() if self.right else 0
if(l >= r):
return l + 1
else:
return r + 1
class BinaryTree:
def depth(self):
if self.root:
return self.root.depth()
else:
return 0
|
순회(Traversal, search)
- 깊이 우선 순회(Depth First Search, DFS)
- 이진 트리를 대상으로 하는 경우에는 세 가지의 서로 다른 순서를 정의할 수 있다.
- 중위 순회(in-order traversal)
- 왼쪽 서브트리를 순회한 뒤 노드 x를 방문, 그리고 나서 오른쪽 서브트리를 순회
- 전위 순회(pre-order traversal)
- 노드 x를 방문한 후에 왼쪽 서브트리를 순회, 마지막으로 오른쪽 서브트리를 순회
- 후위 순회(post-order traversal)
- 왼쪽 서브트리를 순회, 오른쪽 서브트리를 순회, 그리고 나서 마지막으로 노드 x를 방문
- 넓이 우선 순회(Breadth First Search, BFS)
- 중위 순회(In-order Traversal)
- Left subtree
- 자기자신
- Right subtree
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| class Node:
# 자기 자신을 루트로 하는 subtree에 대한 inorder traversal을 재귀적으로
def inorder(self):
traversal = []
# left subtree가 있으면
if self.left:
traversal += self.left.inorder()
traversal.append(self.data)
# right subtree가 있으면
if self.right:
traversal += self.right.inorder()
return traversal
class BinaryTree:
def inorder(self):
if self.root:
return self.root.inorder()
else:
return []
|
- 전위 순회(Pre-order Traversal)
- 자기자신
- Left subtree
- Right subtree
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| class Node:
def preorder(self):
traversal = []
traversal.append(self.data)
if self.left:
traversal += self.left.preorder()
if self.right:
traversal += self.right.preorder()
return traversal
class BinaryTree:
def preorder(self):
if self.root:
return self.root.preorder()
else:
return []
|
- 후위 순회(Post-order Traversal)
- Left subtree
- Right subtree
- 자기자신
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| class Node:
def postorder(self):
traversal = []
if self.left:
traversal += self.left.postorder()
if self.right:
traversal += self.right.postorder()
traversal.append(self.data)
return traversal
class BinaryTree:
def postorder(self):
if self.root:
return self.root.postorder()
else:
return []
|
본 문서는 프로그래머스 어서와! 자료구조와 알고리즘 강의를 수강하고 정리했습니다.
출처 : 프로그래머스 : 어서와! 자료구조와 알고리즘은 처음이지?