Tree Search ๋ฌธ์
Tree: Preorder Traversal
Tree: Inorder Traversal
Tree: Postorder Traversal
Tree: Levelorder Traversal
๋ฌธ์ ๊ณตํต ์ฌํญ
์ด์งํ์ํธ๋ฆฌ ํด๋์ค
# 1. Node ํด๋์ค ์ ์ธ
class Node:
def __init__(self, info):
# Node์ ๋ฐ์ดํฐ = info
self.info = info
# Node์ ์ผ์ชฝ = None
self.left = None
# Node์ ์ค๋ฅธ์ชฝ = None
self.right = None
# Node์ level = None
self.level = None
# init์์ ๊ท์ ํ ํด๋์ค ์์ฒด ๋ด์ฉ์ ์ถ๋ ฅ
def __str__(self):
return str(self.info)
# ์ด์งํ์ํธ๋ฆฌ ํด๋์ค ์ ์ธ
class BinarySearchTree:
def __init__(self):
# root ๋
ธ๋๋ฅผ None์ผ๋ก ์ ์ธ
self.root = None
# ์ด์งํ์ํธ๋ฆฌ์ ๋ฐ์ดํฐ ์ฝ์
def create(self, val):
# root ๋
ธ๋๊ฐ ์์ผ๋ฉด
if self.root == None:
# val ๊ฐ์ ๊ฐ๋ ๋
ธ๋๋ฅผ ์์ฑํ์ฌ root ๋
ธ๋์ ํ ๋นํ๊ณ ๋๋.
self.root = Node(val)
# root ๋
ธ๋๊ฐ ์์ผ๋ฉด
else:
# ํ์ฌ ๋
ธ๋๋ฅผ root ๋
ธ๋๋ก ์ง์
current = self.root
# ๊ณ์ ๋ฐ๋ณต
# ์ฝ์
ํ ์์น๋ฅผ ๋จผ์ ์ฐพ๊ณ , ์๋ฃ๋๋ฉด ํด๋น ๋
ธ๋์ ๋ฐ์ดํฐ๋ฅผ val๋ก ์ง์ ํ๋ ๋ฐฉ์
while True:
# ์ฝ์
ํ๋ ค๋ ๋ฐ์ดํฐ ๊ฐ์ด ํ์ฌ ๋
ธ๋์ ๋ฐ์ดํฐ ๊ฐ๋ณด๋ค ์๋ค๋ฉด โ ์ผ์ชฝ์ผ๋ก ๋ด๋ ค๊ฐ์ ์ฝ์
ํ ์์น๋ฅผ ์ฐพ์.
if val < current.info:
# ํ์ฌ ๋
ธ๋์ ์ผ์ชฝ ๋
ธ๋๊ฐ ์์ผ๋ฉด
if current.left:
# ์ฝ์
ํ ํ์ ์์น๋ฅผ ํ์ฌ ๋
ธ๋์ ์ผ์ชฝ ๋
ธ๋๋ก ๋ณ๊ฒฝ
current = current.left
# ํ์ฌ ๋
ธ๋์ ์ผ์ชฝ ๋
ธ๋๊ฐ ์๋ค๋ฉด
else:
# val ๊ฐ์ ๊ฐ๋ ๋
ธ๋๋ฅผ ์์ฑํ์ฌ ํ์ฌ ๋
ธ๋์ ์ผ์ชฝ ๋
ธ๋์ ํ ๋น.
current.left = Node(val)
# ๋ฐ์ดํฐ ์ฝ์
์ ๋๋์ผ๋ ๋ฐ๋ณต๋ฌธ ์ข
๋ฃ์ํค๊ณ ๋๋.
break
# ์ฝ์
ํ๋ ค๋ ๋ฐ์ดํฐ ๊ฐ์ด ํ์ฌ ๋
ธ๋์ ๋ฐ์ดํฐ ๊ฐ๋ณด๋ค ํฌ๋ค๋ฉด
elif val > current.info:
# ํ์ฌ ๋
ธ๋์ ์ค๋ฅธ์ชฝ ๋
ธ๋๊ฐ ์๋ค๋ฉด
if current.right:
# ์ฝ์
ํ ํ์ ์์น๋ฅผ ํ์ฌ ๋
ธ๋์ ์ค๋ฅธ์ชฝ ๋
ธ๋๋ก ๋ณ๊ฒฝ
current = current.right
# ํ์ฌ ๋
ธ๋์ ์ค๋ฅธ์ชฝ ๋
ธ๋๊ฐ ์๋ค๋ฉด
else:
# val ๊ฐ์ ๊ฐ๋ ๋
ธ๋๋ฅผ ์์ฑํ์ฌ ํ์ฌ ๋
ธ๋์ ์ค๋ฅธ์ชฝ ๋
ธ๋์ ํ ๋น
current.right = Node(val)
# ๋ฐ์ดํฐ ์ฝ์
์ ๋๋์ผ๋ ๋ฐ๋ณต๋ฌธ ์ข
๋ฃ์ํค๊ณ ๋๋.
break
# ์ฝ์
ํ๋ ค๋ ๋ฐ์ดํฐ ๊ฐ์ด ํ์ฌ ๋
ธ๋์ ๋ฐ์ดํฐ ๊ฐ๊ณผ ๋์ผํ๋ค๋ฉด
else:
# ์ฝ์
ํ ํ์๊ฐ ์์ผ๋ ๊ทธ๋ฅ ๋๋.
break
Input & Output
# ์ด์ง ํ์ ํธ๋ฆฌ ์ ์ธ
tree = BinarySearchTree()
# ์์ฑํ ๋
ธ๋ ๊ฐ์ ์
๋ ฅ๋ฐ๊ธฐ
t = int(input())
# n ร 1 ์ฌ์ด์ฆ์ ๋ฆฌ์คํธ ํํ์ array ์์ฑ
arr = list(map(int, input().split()))
# for๋ฌธ์ ๋๋ฉด์ ๋
ธ๋ ์์ฑ
for i in range(t):
tree.create(arr[i])
##### ์ฌ๊ธฐ์ ๋ฌธ์ ์์ ์ํ๋ ํจ์๋ฅผ ์
๋ ฅ๋ฐ์ ์ฝ๋ ์คํํ๊ฒ ๋จ ####
Tree ์ํ ๊ตฌํ
์ ์ฝ์กฐ๊ฑด
Nodes in the tree
์ถ๋ ฅ ํ์
Print the tree's preorder traversal as a single line of space-separated values.
์ ๋ ฅ ์์
1
\
2
\
5
/ \
3 6
\
4
์ถ๋ ฅ ์์
# Preorder
1 2 5 3 4 6
# Inorder
1 2 3 4 5 6
# Postorder
4 3 6 5 2 1
# Levelorder
1 2 5 3 6 4
์ํ ๋ฐฉ์๋ณ ์ดํด๋ณด๊ธฐ
Preorder
๐ฅ Root Node
โ left Node
โ right Node
Code
def PreOrder(root):
# root ๋
ธ๋๊ฐ ์๋ค๋ฉด
if root:
# ํ์ฌ ๋
ธ๋์ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ๊ณ
print(root.info, end=" ")
# ํ์ฌ ๋
ธ๋์ ์ผ์ชฝ์์ PreOrder๋ฅผ ๋ค์ ์งํ
# โ ์ผ์ชฝ์ผ๋ก ํ ๋จ๊ณ ๋ค์ด๊ฐ๋ ๊ฒ์ ์๋ฏธ
PreOrder(root.left)
# ํ์ฌ ๋
ธ๋์ ์ผ์ชฝ์์ Preorder๊ฐ ๋๋ฌ๋ค๋ฉด, ์ค๋ฅธ์ชฝ์์ PreOrder๋ฅผ ๋ค์ ์งํ
# โ ์ค๋ฅธ์ชฝ์ผ๋ก ํ ๋จ๊ณ ๋ค์ด๊ฐ๋ ๊ฒ์ ์๋ฏธ
PreOrder(root.right)
- root ๋ ธ๋์์ ํ์ฌ ๋ ธ๋์ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ๊ณ
- ๊ทธ ๋ค์์ ์ผ์ชฝ ๋ ธ๋๋ก ๋ด๋ ค๊ฐ์ ํด๋น ๋ ธ๋์ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅ
- ์์ ๊ณผ์ ์ ๋ฐ๋ณต
- ๋์ด์ ํ๊ณ ๋ค ์ผ์ชฝ ๋ ธ๋๊ฐ ์์ผ๋ฉด ๋ฐ๋ก ์ด์ ๋ ธ๋๋ก ๋์๊ฐ ํด๋น ๋ ธ๋์ ์ค๋ฅธ์ชฝ ๋ ธ๋๋ก ๋ด๋ ค๊ฐ.
- ์ด ๊ณผ์ ์ ๋๊น์ง ๋ฐ๋ณต
Inorder
๐ฅ left Node
โ Root Node
โ right Node
Code
def inOrder(root):
# root ๋
ธ๋๊ฐ ์๋ค๋ฉด
if root:
# ํ์ฌ ๋
ธ๋์ ์ผ์ชฝ์์ inOrder๋ฅผ ๋ค์ ์งํ
inOrder(root.left)
# ํ์ฌ ๋
ธ๋์ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅ
print(root.info, end=" ")
# ํ์ฌ ๋
ธ๋์ ์ค๋ฅธ์ชฝ์์ inOrder๋ฅผ ๋ค์ ์งํ
inOrder(root.right)
- root ๋ ธ๋๋ถํฐ ํ์ฌ ๋ ธ๋์ ์ผ์ชฝ ๋ ธ๋๋ก ๋ด๋ ค๊ฐ๋ ๊ณผ์ ์ ๋ฐ๋ณต
- ํ์ฌ ๋ ธ๋ ๊ธฐ์ค, ๋์ด์ ํ๊ณ ๋ค ์ผ์ชฝ ๋ ธ๋๊ฐ ์์ผ๋ฉด ํ์ฌ ๋ ธ๋์ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅ
- ๋ฐ๋ก ์ด์ ๋ ธ๋๋ก ๋์๊ฐ ํด๋น ๋ ธ๋์ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅ
- ๊ทธ ๋ ธ๋์ ์ค๋ฅธ์ชฝ ๋ ธ๋๋ก ๋ด๋ ค๊ฐ์ ํด๋น ๋ ธ๋์ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅ
- ์ด ๊ณผ์ ์ ๋๊น์ง ๋ฐ๋ณต
Postorder
๐ฅ Root Node
โ left Node
โ right Node
Code
def postOrder(root):
# root ๋
ธ๋๊ฐ ์๋ค๋ฉด
if root:
# ํ์ฌ ๋
ธ๋์ ์ผ์ชฝ์์ postOrder๋ฅผ ๋ค์ ์งํ
postOrder(root.left)
# ํ์ฌ ๋
ธ๋์ ์ค๋ฅธ์ชฝ์์ postOrder๋ฅผ ๋ค์ ์งํ
postOrder(root.right)
# ํ์ฌ ๋
ธ๋์ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅ
print(root.info, end=" ")
- root ๋ ธ๋๋ถํฐ ํ์ฌ ๋ ธ๋์ ์ผ์ชฝ ๋ ธ๋๋ก ๋ด๋ ค๊ฐ๋ ๊ณผ์ ์ ๋ฐ๋ณต
- ๋์ด์ ํ๊ณ ๋ค ๋ ธ๋๊ฐ ์์ผ๋ฉด ํ์ฌ ๋ ธ๋์ ์ค๋ฅธ์ชฝ ๋ ธ๋๋ก ๋ด๋ ค๊ฐ
- ํ์ฌ ๋ ธ๋์ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅ
- ์ด ๊ณผ์ ์ ๋๊น์ง ๋ฐ๋ณต
Levelorder
๐ฅ Root Node
โ left Node
โ right Node
- ๊ฐ Level์ ๋ ธ๋๋ฅผ ์ผ์ชฝ๋ถํฐ ์ถ๋ ฅ ํ, ๊ทธ ๋ค์ Level๋ก ๋์ด๊ฐ ์ด ๊ณผ์ ์ ๋ฐ๋ณต
Code
from collections import deque
def levelOrder(root):
if not root:
return
# deque ์์ฑ
queue = deque()
# root ๋
ธ๋๋ฅผ ์ถ๊ฐ
queue.append(root)
# queue์ ์๋ฌด ๊ฒ๋ ์์ ๋๊น์ง ๋ฐ๋ณต
while queue:
# queue์ ์ฒซ ๋ฒ์งธ ๊ฐ์ฒด๋ฅผ ์ถ์ถํ์ฌ ํ์ฌ ๋
ธ๋์ ํ ๋น
current_node = queue.popleft()
# ํ์ฌ ๋
ธ๋์ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅ
print(current_node.info, end = ' ')
# ํ์ฌ ๋
ธ๋์ ์ผ์ชฝ ๋
ธ๋๊ฐ ์๋ค๋ฉด?
if current_node.left:
# queue์ ํด๋น ๋
ธ๋๋ฅผ ์ถ๊ฐ
queue.append(current_node.left)
# ํ์ฌ ๋
ธ๋์ ์ค๋ฅธ์ชฝ ๋
ธ๋๊ฐ ์๋ค๋ฉด?
if current_node.right:
# queue์ ํด๋น ๋
ธ๋๋ฅผ ์ถ๊ฐ
queue.append(current_node.right)
FIFO(First In First Out)
๋ฐฉ์์Queue
์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํดcollections
๋ชจ๋์deque
์import
- ์์
Level
๋ถํฐ ๋ ธ๋๋ค์ ์์๋๋ก ๋ด์queue
๋ฅผdeque
์๋ฃ๊ตฌ์กฐ๋ก ์ ์ธroot
๋ ธ๋๋ถํฐ ์์ํ์ฌ ํด๋น ๋ ธ๋์ ์ผ์ชฝ ๋ ธ๋์ ์ค๋ฅธ์ชฝ ๋ ธ๋๊ฐ ์์๋๋กqueue
์ ์์ด๊ฒ ๋จ.- ๋ ธ๋ ๋ฐ์ดํฐ์ ์ถ๋ ฅ์
queue
์์ ์ผ์ชฝ๋ถํฐ ๋ฝํ ๋์ ์งํ๋๊ธฐ ๋๋ฌธ์ ์์Level
๋ถํฐ ์์ํด์ ํ์ฌ ๋ ธ๋์ ์ผ์ชฝ๋ถํฐ ์ค๋ฅธ์ชฝ์ผ๋ก ์์๋๋ก ์ถ๋ ฅ๋๊ณ ๊ทธ ๋ค์Level
๋ก ๋์ด๊ฐ์ ๋ฐ๋ณต๋๋ ํํ๋ก ์งํ๋จ.