๐กํธ๋ฆฌ ์ํ(Tree traversal)
ํธ๋ฆฌ์ ๋ชจ๋ ๋
ธ๋๋ฅผ ํ ๋ฒ์ฉ ๋ฐฉ๋ฌธํ๋ ๊ฒ์ ๋งํ๋ค.
๋ฐ์ดํฐ๋ฅผ ์ด๋ค ์์๋ก ๋ณผ ๊ฒ์ด๋์ ๋ฐ๋ผ์ ์ ์์ํ, ์ค์์ํ, ํ์์ํ๋ก ๋๋ ์ง๋ค.
โ์ ์ ์ํ
๋ฃจํธ ๋
ธ๋ -> ์ผ์ชฝ ์์๋
ธ๋ -> ์ค๋ฅธ์ชฝ ์์๋
ธ๋
1. ๋ฃจํธ ๋
ธ๋ A์์๋ถํฐ ์์, A๊ฐ ๋ฃจํธ ๋
ธ๋์ด๋ฏ๋ก A ๋จผ์ , A ๊ธฐ์ค์ผ๋ก ๋ดค์ ๋ ์ผ์ชฝ ์์๋
ธ๋๋ B์ด๋ฏ๋ก B ๋ฐฉ๋ฌธ.
2. B๋ก ์์ B๊ฐ ๋ค์ ๋ฃจํธ ๋
ธ๋๋ผ๊ณ ์๊ฐํ๋ฉด B์ ์ผ์ชฝ ์์๋
ธ๋๋ C์ด๋ฏ๋ก C๋ฅผ ๋ฐฉ๋ฌธ.
3. C์ ์ผ์ชฝ ์์๋
ธ๋, ์ค๋ฅธ์ชฝ ์์๋
ธ๋๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ค์ B์ ์ค๋ฅธ์ชฝ ๋
ธ๋์ธ D๋ฅผ ๋ฐฉ๋ฌธ.
4. D๊ฐ ๋ฐฉ๋ฌธํ ์ ์๋ ๋
ธ๋๊ฐ ์๊ธฐ ๋๋ฌธ์ B๋ก ๋ค์์ค๋ฉด B์์ ๋ฐฉ๋ฌธํ ์ ์๋ ๋
ธ๋๋ ์ด๋ฏธ ๋ฐฉ๋ฌธ์๋ฃ. ๋ฐ๋ผ์ A์ ์ค๋ฅธ์ชฝ ์์๋
ธ๋ E ๋ฐฉ๋ฌธ.
5. E์ ์ผ์ชฝ ์์ ๋
ธ๋ F๋ฐฉ๋ฌธ ํ , ์ค๋ฅธ์ชฝ ์์ ๋
ธ๋ G๋ฐฉ๋ฌธ.
์ฝ๋ ์์
def preorder(self):
def _preorder(node):
print(node.item, end=' ')
if node.left:
_preorder(node.left)
if node.right:
_preorder(node.right)
_preorder(self.root)
โ ์ค์ ์ํ
์ผ์ชฝ ์์๋
ธ๋ -> ๋ฃจํธ ๋
ธ๋ -> ์ค๋ฅธ์ชฝ ์์๋
ธ๋
1. A์์ ์ผ์ชฝ ์์๋
ธ๋์ธ B ๋ฐฉ๋ฌธํ๋๋ฐ B๋ ์ผ์ชฝ ์์๋
ธ๋๊ฐ ์์ผ๋ฏ๋ก ๊ฐ์ฅ ์ผ์ชฝ ์์๋
ธ๋์ธ C๋ถํฐ ์ฒ์์ ๋ฐฉ๋ฌธ.
2. C๋ ์ผ์ชฝ ์์๋
ธ๋๊ฐ ์์ผ๋ฏ๋ก ๋ฃจํธ ๋
ธ๋์ธ D๋ฐฉ๋ฌธ, ๋ค์์ผ๋ก ์ค๋ฅธ์ชฝ ์์๋
ธ๋์ธ D๋ฐฉ๋ฌธ.
3. D๋ฅผ ๋ฐฉ๋ฌธํ ํ ๋์ด์ ๋ฐฉ๋ฌธํ ๋
ธ๋๊ฐ ์์ผ๋ฏ๋ก, A๋ฃจํธ๋ก ๋์์์ ๋ฐฉ๋ฌธ.
4. A์์ ์ผ์ชฝ ์๋
ธ๋๋ฅผ ์ด๋ฏธ ๋ค ๋ฐฉ๋ฌธํ์ผ๋ ์ค๋ฅธ์ชฝ ์์๋
ธ๋์ธ E๋ก ๊ฐ์ ์ผ์ชฝ ์์๋
ธ๋์ธ F ๋ฐฉ๋ฌธ.
5. F ๋ฐฉ๋ฌธ ํ, ๋ฃจํธ ๋
ธ๋์ธ E๋ก ๋์๊ฐ์ ๋ฐฉ๋ฌธ ํ , ์ค๋ฅธ์ชฝ ์์๋
ธ๋์ธ G ๋ฐฉ๋ฌธ.
์ฝ๋ ์์
def inorder(self):
def _inorder(node):
if node.left:
_inorder(node.left)
print(node.item, end=' ')
if node.right:
_inorder(node.right)
_inorder(self.root)
โโ ํ์ ์ํ
์ผ์ชฝ ์์๋
ธ๋ -> ์ค๋ฅธ์ชฝ ์์๋
ธ๋ -> ๋ฃจํธ ๋
ธ๋
1. A์์ ์ผ์ชฝ ์์ ๋
ธ๋ ๋๊น์ง ๋ด๋ ค๊ฐ์ C๋ถํฐ ๋ฐฉ๋ฌธ.
2. ์ผ์ชฝ ์์๋
ธ๋ C ๋ฐฉ๋ฌธ ํ ์ค๋ฅธ์ชฝ ์์๋
ธ๋ D ๋ฐฉ๋ฌธ.
3. ๋ฃจ๋ ๋
ธ๋์ธ B ๋ฐฉ๋ฌธ.
4. A์ ๊ธฐ์ค์์ ์ผ์ชฝ ์์ ๋
ธ๋ ๋ค ๋ฐฉ๋ฌธ ํ์์ผ๋ ์ค๋ฅธ์ชฝ ์์๋
ธ๋ ๋ฐฉ๋ฌธํ๋ฌ ๊ฐ. E์ ์ผ์ชฝ ์์๋
ธ๋ F๋ถํฐ ๋ฐฉ๋ฌธ.
5. ์ผ์ชฝ ์์ ๋
ธ๋ F ๋ฐฉ๋ฌธ ํ ์ค๋ฅธ์ชฝ ์์๋
ธ๋ G๋ฐฉ๋ฌธ.
6. ๋ฃจํธ ๋
ธ๋ E ๋ฐฉ๋ฌธ ํ A ๋ฃจํธ ๋
ธ๋ ๋ฐฉ๋ฌธ.
์ฝ๋ ์์
def postorder(self):
def _postorder(node):
if node.left:
_postorder(node.left)
if node.right:
_postorder(node.right)
print(node.item, end=' ')
_postorder(self.root)
์ ์ฒด ์ฝ๋ ์์
from collections import deque
class Node(object):
def __init__(self, item):
self.item = item
self.left = self.right = None
class BinaryTree(object):
def __init__(self):
self.root = None
#์ ์ ์ํ
def preorder(self):
def _preorder(node):
print(node.item, end=' ')
if node.left:
_preorder(node.left)
if node.right:
_preorder(node.right)
_preorder(self.root)
#์ค์ ์ํ
def inorder(self):
def _inorder(node):
if node.left:
_inorder(node.left)
print(node.item, end=' ')
if node.right:
_inorder(node.right)
_inorder(self.root)
#ํ์ ์ํ
def postorder(self):
def _postorder(node):
if node.left:
_postorder(node.left)
if node.right:
_postorder(node.right)
print(node.item, end=' ')
_postorder(self.root)