
ํธ๋ฆฌ(tree)๋ ์ด์ฐจ์์ ์๋ฃ๊ตฌ์กฐ๋ก ๋ ธ๋์ ์ฃ์ง๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ์ ๋ฐฐ์นํํ๋ฅผ ์ถ์ํํ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
๋ชจ๋ ๋
ธ๋์ ์ฐจ์๊ฐ 2 ์ดํ์ธ ํธ๋ฆฌ์
๋๋ค.
*์ฌ๊ท์ ์ผ๋ก ์ ์ํ ์ ์์
1. left subtree, 2. ์๊ธฐ ์์ 3.right subtree
#์ ์์ํ(Pre-order Traversal)
1. ์๊ธฐ์์ , 2. left subtree 3.right subtree
#ํ์์ํ(post-order Traversal)
1. left subtree, 2. right subtree 3.์๊ธฐ ์์
-๋์ด ์ฐ์ ์ํ
Node - ๋ฐ์ดํฐ, LeftChild, RightChild
Tree - root,leaf
size() - ์ฌ๊ท์ ์ผ๋ก ๊ฐ๊ฐ์ ์๋ธํธ๋ฆฌ์ฌ์ด์ฆ +1(์๊ธฐ์์ )
depth() - ๊ฐ์ฅ ํฐ depth๋ฅผ ๊ฐ์ง ์๋ธํธ๋ฆฌ +1
inorder() - ์ค์์ํ
preorder() - ์ ์์ํ
postorder() - ํ์์ํ
bft() - ๋์ด ์ฐ์ ์ํ
๋ค์์ ํ์ด์ฌ์ผ๋ก ๊ตฌํํ ์ฝ๋์ด๋ค.
class Node:
def __init__(self, key, data):
self.key = key
self.data = data
self.left = None
self.right = None
def size(self):
l = self.left.size() if self.left else 0
r = self.right.size() if self.right else 0
return l+r+1
def depth(self):
l = self.left.depth() if self.left else 0
r = self.right.depth() if self.right else 0
return max(l,r) + 1
def inorder(self):
traversal = []
if self.left:
traversal += self.left.inorder()
traversal.append(self.data)
if self.right:
traversal += self.right.inorder()
return traversal
def preorder(self):
traversal = []
traversal.append(self.data)
if self.left:
traversal += self.left.preorder()
if self.right:
traversal += self.right.preorder()
return traversal
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 __init__(self,r):
self.root = r
def size(self):
if self.root:
return self.root.size()
else:
return 0
def depth(self):
if self.root:
return self.root.depth()
else:
return 0
def inorder(self):
if self.root:
return self.root.inorder()
else:
return []
ใ
def preorder(self):
if self.root:
return self.root.preorder()
else:
return []
def postorder(self):
if self.root:
return self.root.postorder()
else:
return []
def bft(self):
#๋ฆฌํดํ ๋ณ์์ ๋น ๋ฆฌ์คํธ๋ฅผ ๋ฃ๊ณ , ๋นํ ์์ฑ
traversal = []
q = ArrayQueue()
#๋น ํธ๋ฆฌ๊ฐ ์๋๋ฉด rootnode๋ฅผ ํ์ ์ถ๊ฐ
if self.root:
q.enqueue(self.root.data)
while q:# ํ๊ฐ ๋น์ด์์ง ์๋๋์
element = q.dequeue() #node<-ํ ์์ ์์๋ฅผ ์ถ์ถ
traversal.append(element.data) #node๋ฅผ ๋ฐฉ๋ฌธํ๋ค๋ ํ์
#์์ ๋
ธ๋๊ฐ ์์ผ๋ฉด ์ผ์ชฝ ์ค๋ฅธ์ชฝ์์๋ค ํ์ ์ถ๊ฐ
if element.left:
q.enqueue(element.left)
if element.right:
q.enqueue(element.right)
return traversal
๐ก๋๋ถ๋ถ์ ์ํ๋ ์ฌ๊ท์ ์ผ๋ก ๊ตฌํ์ด ๊ฐ๋ฅํ์ง๋ง, ๋์ด ์ฐ์ ์ํ๋ ํ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ์ ๋ ์์๋ ธ๋๋ ๋ฐฉ๋ฌธํด์ผ ํ์ง๋ง ๊ฐ์ ์์ค์ ๋ ธ๋๋ค์ ๋จผ์ ๋ฐฉ๋ฌธํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ฌ๊ท์ ์ธ ์ฑ์ง์ ๊ฐ์ง์ง ์์ ์ฌ๊ท์ ์ผ๋ก ๊ตฌํ์ด ๋ถ๊ฐ๋ฅํ๋ค.