루트의 레벨을 레벨 1로 하고 자식으로 내려가면서 하나씩 더해지는 개념
깊이와 연관되어 있음
트리의 깊이(depth)/높이(height) : 트리가 가지는 최대 레벨
e = n - 1
-> e >= n이 되는 경우, 트리에서는 사이클이 생겨서 더이상 트리가 아니게 됨.
e : 에지의 개수, n : 노드의 개수
트리를 구성하는 노드의 자식이 최대 2개인 트리
- 레벨 l에 대한 이진 트리의 최대 노드의 개수 : 2^ㅣ-1
- 트리 높이 h에 대한 이진트리의 최대 노드의 개수 : 2^h - 1
- 방문순서 : 현재노드 > 왼쪽 서브트리 > 오른쪽 서브트리
class Node:
def __init__(self, item):
self.item = item
self.left = None
self.right = None
class BinaryTree():
def __init__(self):
self.root = None
def preorder(self, n):
if n!= None:
print(n.item, '', end='')
if n.left:
self.preorder(n.left)
if n.right:
self.preorder(n.right)
tree = BinaryTree()
n1 = Node(1)
n2 = Node(2)
n3 = Node(3)
n4 = Node(4)
n5 = Node(5)
n6 = Node(6)
n7 = Node(7)
tree.root = n1
n1.left = n2; n1.right = n3
n2.left = n4; n2.right = n5
n3.left = n6; n3.right = n7
# 트리 만들기
print(tree.preorder(tree.root))
def iter_preorder(cur):
s = Stack()
while True:
while cur:
print(cur.data, end='')
s.push(cur)
cur = cur.left
cur = s.pop()
if not cur :
break
cur = cur.right
cur = cur.left
: 왼쪽 방향으로 쭉 순회cur = s.pop()
: pop을 통해 가져온 노드cur = cur.right
: 왼쪽 서브트리를 방문했으므로 오른쪽 서브트리 방문할 차례
- 방문 순서 : 왼쪽 서브트리 -> 현재노드 -> 오른쪽 서브트리
def inorder(self, n):
if n == None:
return
self.inorder(n.left)
print(n.item, '', end='')
self.inorder(n.right)
def iter_inorder(cur):
s = Stack()
while True:
while cur:
s.push(cur)
cur = cur.left
cur = s.pop()
if not cur:
break
# pop한 후에 방문을 합니다.
print(cur.data, end=' ')
cur = cur.right
방문순서 : 왼쪽 서브트리 -> 오른쪽 서브트리 -> 현재 노드
def postorder(self, n):
if n!=None:
if n.left:
self.postorder(n.left)
if n.right:
self.postorder(n.right)
print(n.item, '', end='')
레벨을 하나씩 내려가면서 해당 레벨에 있는 모든 노드 순회
def levelorder(self, root):
q = Queue()
q.put(root)
while not q.empty():
t = q.get()
print(t.item, end=' ')
if t.left:
q.put(t.left)
if t.right:
q.put(t.right)