๐Binary Search Tree
๋ค์๊ณผ ๊ฐ์ ์กฐ๊ฑด์ด ๋ถ์ ์ด์ง ํธ๋ฆฌ
์ผ์ชฝ ์์ ๋ ธ๋์๋ ์์ ๋ณด๋ค ์์ ๊ฐ์ค๋ฅธ์ชฝ ์์ ๋ ธ๋์๋ ์์ ๋ณด๋ค ํฐ ๊ฐ- ๋ชจ๋ ๋ ธ๋๋ ์ ์ผํ ๊ฐ์ ๊ฐ์ง

- ์ด์งํ์์ ํจ์จ์ ์ธ ํ์์ ์ ์งํ๋ฉด์๋, ๋น๋ฒํ ์ฝ์ /์ญ์ ๋ฅผ ๊ฐ๋ฅํ๊ฒ ๊ณ ์๋จ
๐์ํ ๋ฐฉ๋ฒ

- ๋ถ๋ชจ ๋ ธ๋์ ์ผ์ชฝ ๋ ธ๋, ์ค๋ฅธ์ชฝ ๋ ธ๋๋ฅผ ์ด๋ค ์์๋ก ๋ฐฉ๋ฌธํ๋๋์ ๋ฐ๋ผ ๋๋ ์ง
- ์ํํ๋ ๋ฐฉ๋ฒ์ ์ฌ๊ท์ ( โต ๊ฐ ๋ ธ๋๋ ์๋ธ ํธ๋ฆฌ)
1. ์ ์ ์ํ(Preorder Traversal)
ํ์ฌ ๋ ธ๋-์ผ์ชฝ ๋ ธ๋-์ค๋ฅธ์ชฝ ๋ ธ๋ ์์ผ๋ก ์ํํ๋ ๋ฐฉ๋ฒ
์ํ ๊ฒฐ๊ณผ : A โ B โ D โ G โ E โ C โ F
2. ์ค์ ์ํ(Inorder Traversal)
์ผ์ชฝ ๋ ธ๋-ํ์ฌ ๋ ธ๋-์ค๋ฅธ์ชฝ ๋ ธ๋ ์์ผ๋ก ์ํํ๋ ๋ฐฉ๋ฒ
์ํ ๊ฒฐ๊ณผ : G โ D โ B โ E โ A โ F โ C
- ์ด์งํ์ํธ๋ฆฌ ๋ด์ ์๋ ๋ชจ๋ ๊ฐ๋ค์ ์ ๋ ฌ๋ ์์๋๋ก ํ์ ๊ฐ๋ฅ
3. ํ์ ์ํ(Postorder Traversal)
์ผ์ชฝ ๋ ธ๋-์ค๋ฅธ์ชฝ ๋ ธ๋-ํ์ฌ ๋ ธ๋ ์์ผ๋ก ์ํํ๋ ๋ฐฉ๋ฒ
์ํ ๊ฒฐ๊ณผ : G โ D โ E โ B โ F โ C โ A
4. ๋ ๋ฒจ ์์ ์ํ(Level Order Traversal)
๋ ๋ฒจ 0(๋ฃจํธ ๋ ธ๋)๋ถํฐ ๋ ๋ฒจ ์ฐจ๋ก๋ก ๋ฐฉ๋ฌธํ๋ฉฐ, ๊ฐ์ ๋ ๋ฒจ์์๋ ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ๊ฐ๋ฉฐ ์ํํ๋ ๋ฐฉ๋ฒ
์ํ ๊ฒฐ๊ณผ : A โ B โ C โ D โ E โ F โ G
- ํ๋ก ๊ตฌํ
๐๊ตฌํ
๐Node Class
class Node:
def __init__(self, data):
self.data = data
self.left = None
self.right = None๐Binary Search Tree Class
class BinarySearchTree:
def __init__(self, root):
self.root = rootInsert
def insert(self, data):
self.cur = self.root
while True:
# ์ถ๊ฐํ ๋
ธ๋๊ฐ ํ์ฌ ์์น์ ๋
ธ๋๋ณด๋ค ์์ ๋(์ผ์ชฝ ์๋ธ ํธ๋ฆฌ)
if data < self.cur.data:
# ์ผ์ชฝ ์์ ๋
ธ๋๊ฐ ์์ ๋ โ ํ์ฌ ์์น ์ผ์ชฝ ์์ ๋
ธ๋๋ก ๋ฐ๊พธ๊ณ ๊ณ์ ํ์
if self.cur.left != None:
self.cur = self.cur.left
# ์ผ์ชฝ ์์ ๋
ธ๋๊ฐ ์์ ๋ โ ํด๋น ์์น์ ์ถ๊ฐํ ๊ฐ์ ์ฐ๊ฒฐ ํ ํ์ ๋
else:
self.cur.left = Node(data)
break
# ์ถ๊ฐํ ๋
ธ๋๊ฐ ํ์ฌ ์์น์ ๋
ธ๋๋ณด๋ค ํด ๋(์ค๋ฅธ์ชฝ ์๋ธ ํธ๋ฆฌ)
else:
# ์ค๋ฅธ์ชฝ ์์ ๋
ธ๋๊ฐ ์์ ๋ โ ํ์ฌ ์์น ์ค๋ฅธ์ชฝ ์์ ๋
ธ๋๋ก ๋ฐ๊พธ๊ณ ๊ณ์ ํ์
if self.cur.right != None:
self.cur = self.cur.right
else:
self.cur.right = Node(data)
breakSearch
def search(self, data):
self.cur = self.root
while self.cur:
# ์ฐพ๊ณ ์ ํ๋ ๋
ธ๋ ์ฐพ์ ๊ฒฝ์ฐ
if data == self.cur.data:
return True
# ์ฐพ๊ณ ์ ํ๋ ๋
ธ๋๊ฐ ํ์ฌ ์์น์ ๋
ธ๋๋ณด๋ค ์์ ๋ โ ํ์ฌ ์์น ์ผ์ชฝ ์์ ๋
ธ๋๋ก ๋ฐ๊พธ๊ณ ๊ณ์ ํ์
elif data < self.cur.data:
self.cur = self.cur.left
# ์ฐพ๊ณ ์ ํ๋ ๋
ธ๋์ด ํ์ฌ ์์น์ ๋
ธ๋๋ณด๋ค ํด ๋ โ ํ์ฌ ์์น ์ค๋ฅธ์ชฝ ์์ ๋
ธ๋๋ก ๋ฐ๊พธ๊ณ ๊ณ์ ํ์
else:
self.cur = self.cur.right
# ์ฐพ๊ณ ์ ํ๋ ๋
ธ๋ ๋ชป ์ฐพ์ ๊ฒฝ์ฐ
return FalseRemove
def remove(self, data):
searched = False
self.cur = self.root
self.parent = self.root
# ์ญ์ ํ๊ณ ์ ํ๋ ๋
ธ๋๊ฐ ํธ๋ฆฌ ์์ ์กด์ฌํ๋์ง ์ฒดํฌ
while self.cur:
if data == self.cur.data:
searched = True
break
elif data < self.cur.data:
self.parent = self.cur
self.cur = self.cur.left
else:
self.parent = self.cur
self.cur = self.cur.right
# ์ญ์ ํ๊ณ ์ ํ๋ ๋
ธ๋ ์์
if not searched:
return False1. ์์ ๋ ธ๋๊ฐ ์๋ ๊ฒฝ์ฐ
๋ถ๋ชจ ๋ ธ๋๊ฐ ์ญ์ ํ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค์ง ์๋๋ก ํจ

# ์ญ์ ํ ๋
ธ๋์ ์์ ๋
ธ๋๊ฐ ์๋ ๊ฒฝ์ฐ
if self.cur.left == self.cur.right == None:
if data < self.parent.data:
self.parent.left = None
else:
self.parent.right = None2. ์์ ๋ ธ๋๊ฐ 1๊ฐ์ธ ๊ฒฝ์ฐ
๋ถ๋ชจ ๋ ธ๋๊ฐ ์ญ์ ํ ๋ ธ๋์์์ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ํจ

# ์ญ์ ํ ๋
ธ๋์ ์์ ๋
ธ๋๊ฐ 1๊ฐ์ธ ๊ฒฝ์ฐ
# ๊ทธ ๊ฒฝ์ฐ ์ค ์ญ์ ํ ๋
ธ๋์ ์์ ๋
ธ๋๊ฐ ์ผ์ชฝ ์์ ๋
ธ๋์ธ ๊ฒฝ์ฐ
elif self.cur.left != None and self.cur.right == None:
if data < self.parent.data:
self.parent.left = self.cur.left
else:
self.parent.right = self.cur.left
# ๊ทธ ๊ฒฝ์ฐ ์ค ์ญ์ ํ ๋
ธ๋์ ์์ ๋
ธ๋๊ฐ ์ค๋ฅธ์ชฝ ์์ ๋
ธ๋์ธ ๊ฒฝ์ฐ
elif self.cur.left == None and self.cur.right != None:
if data < self.parent.data:
self.parent.left = self.cur.right
else:
self.parent.right = self.cur.right3. ์์ ๋ ธ๋๊ฐ 2๊ฐ์ธ ๊ฒฝ์ฐ

Preorder Traversal
def preorder_traversal(self, node):
if not node:
return
print(node.data, end =' ')
self.preorder_traversal(node.left)
self.preorder_traversal(node.right)Inorder Traversal
def inorder_traversal(self, node):
if not node:
return
self.inorder_traversal(node.left)
print(node.data, end =' ')
self.inorder_traversal(node.right)postorder Traversal
def postorder_traversal(self, node):
if not node:
return
self.postorder_traversal(node.left)
self.postorder_traversal(node.right)
print(node.data, end =' ')Levelorder Traversal
def levelorder_traversal(self, root):
q = [(root, 0)]
l = 0
while q:
node, level = q.pop(0)
print(node.data, end = ' ')
# ๋ ๋ฒจ ๋ณ ์ค๋ฐ๊ฟ ์ถ๋ ฅ
if level != l:
l += 1
print()
if node.left:
q.append((node.left, level + 1))
if node.right:
q.append((node.right, level + 1))๐์๊ฐ๋ณต์ก๋
h๋ ํธ๋ฆฌ์ ๋์ด
| ์ฐ์ฐ | ์๊ฐ๋ณต์ก๋ |
|---|---|
| ์ฝ์ | O(h) |
| ์ญ์ | O(h) |
| ํ์ | O(h) |
- ์ฐ์ฐ ๋ชจ๋ ํธ๋ฆฌ์ ๋์ด์ ์ํด ์๊ฐ๋ณต์ก๋๊ฐ ๊ฒฐ์ โ ํธ๋ฆฌ๊ฐ ํ ์ชฝ์ผ๋ก ์น์ฐ์ณ์ง ๊ฒฝ์ฐ ์๊ฐ๋ณต์ก๋๊ฐ ๋๋ฌด ์ปค์ง