์๊ณ ๋ฆฌ์ฆ
[์๋ฃ๊ตฌ์กฐ] ํธ๋ฆฌ ์ํ (+์ฝ๋ ๊ตฌํ with Python)
kirr
2023. 5. 17. 18:43
๐กํธ๋ฆฌ ์ํ(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)