1. 트리구조의 순회방법
1)전위 순회(Preorder): Root를 제일먼저 순회 (Root ->Left -> Right)
( A, B, D, H, E, C, F, G)
2)중위 순회(Inorder): Root를 중간에 순회(Left -> Root -> Right)
(H, D, B, E, A, F, C,G)
3)후위 순회(Posterorder): Root를 제일 나중에 순회(Left -> right -> Right)
(H, D, E, B, F, G, C, A)
4) 레벨 순회(Levelorder) : 위의 레벨부터 순차적으로 탐색(BFS:Breath First Search)
(A, B, C, D, E, F, G, H)
-레벨 순회를 제외한 순회들은 깊이부터 탐색하는 DFS(Depth First Search)이다.
-구현
from collections import deque
#기본개념
class Node:
def __init__(self, data):
self.data = data
self.right = None
self.left = None
a = Node(1)
a.right = Node(2)
a.left = Node(3)
class Bst:
def __init__(self, data):
self.root = Node(data)
def add_(self,data):
pointer = self.root
while True:
if data > pointer.data:
if pointer.right == None: #그 자리가 None이면 바로 대입
pointer.right = Node(data)
break
else: #아니면 그 자리로 이동
pointer = pointer.right
elif data < pointer.data:
if pointer.left == None:
pointer.left = Node(data)
break
else:
pointer = pointer.left
def search(self, data):
pointer = self.root
process = []
while True:
if data > pointer.data:
if pointer.right == None:
print('데이터가 없습니다.')
process = []
break
else:
process.append('R')
if pointer.right.data == data:
break
else:
pointer = pointer.right
elif data < pointer.data:
if pointer.left == None:
print('데이터가 없습니다.')
process = []
break
else:
process.append('L')
if pointer.left.data == data:
break
else:
pointer = pointer.left
else:
return [0]
return process
def preorder(self, node):
if node:
print(node.data, end=' ')
self.preorder(node.left) #재귀끝나면 그 아래꺼 실행
self.preorder(node.right)
def inorder(self, node):
if node:
self.inorder(node.left) #재귀끝나면 그 아래꺼 실행
print(node.data, end=' ')
self.inorder(node.right)
def posterorder(self, node):
if node:
self.posterorder(node.left) #재귀끝나면 그 아래꺼 실행
self.posterorder(node.right)
print(node.data, end=' ')
def levelorder(self):
que = deque()
pointer = self.root #처음은 루트노드
que.append(pointer)
def reg(pointer):
que.popleft()
print(pointer.data) #que에 나오면서 출력
if pointer.left != None or pointer.right != None: #자식노드 큐에 삽입
que.append(pointer.left)
que.append(pointer.right)
if que:
reg(que[0])
reg(pointer)
a = Bst(10)
a.add_(7)
a.add_(6)
a.add_(8)
a.add_(15)
a.add_(13)
a.add_(17)
a.preorder(a.root) #전위
a.inorder(a.root) #중위
a.posterorder(a.root) #후위
a.levelorder() #레벨
'컴퓨터 > 자료구조와 알고리즘' 카테고리의 다른 글
자료구조와 알고리즘 - 힙(Heap) (0) | 2023.01.21 |
---|---|
자료구조와 알고리즘 - 그래프 (0) | 2023.01.08 |
자료구조와 알고리즘 - 트리구조링크드 리스트 (0) | 2022.12.30 |
자료구조와 알고리즘 - 트리구조 (0) | 2022.12.30 |
자료구조와 알고리즘 - 스택과 큐 (0) | 2022.12.26 |