์ฐ๋ฆฌ๋ ์ด๊ฒ์ ๋ฐฐ์ฐ๊ธฐ ์ ์ ์ ์ฐ๋์ง ์๊ฐํด๋ณด์์ผ ํ๋ค. ์ ์ฐ๋์ง ์ง๋ฌธ์ ํ๊ณ ๊ฑฐ๊ธฐ์ ๋ํ ๋ต์ ๋ธ ํ์ ๋ฐฐ์์ผ ํ๋ค.
์ ์ฐ๋๊ณ ๋ฌป๋๋ค๋ฉด ๊ฐ์ ์ ์ ์ฅํ๊ธฐ ์ํด์์ด๋ค. ๋ฐฐ์ด ์ธ๋ฑ์ค์ ๊ฒฝ์ฐ์ ๊ฒ์์ ๋ก๊ทธ n / ์ฝ์ ์ญ์ ์ n์ ์๊ฐ์ด ๋ค์ด๊ฐ๋ค๊ณ ํ๋ค. ํ์ง๋ง ์ด์ง ๊ฒ์ ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค๋ฉด ๊ฒ์ ์ฝ์ ์ญ์ ๋ชจ๋ ํ๊ท ์ ์ผ๋ก ๋ก๊ทธ n์ ์๊ฐ์ด ์์ ๋๋ค๊ณ ํ๋ค.
์ด์ง ๊ฒ์ ํธ๋ฆฌ๋ฅผ ๋ง๋ค ๋ ๋ฃจํธ๋ณด๋ค ํฐ ๊ฐ์ ์ค๋ฅธ์ชฝ ์์ ๊ฐ์ ์ผ์ชฝ์ ๋ฃ๋๋ค.
๋ค์๊ณผ ๊ฐ์ ์์ผ๋ก ๋ง์ด๋ค. ์ผ ์ชฝ ์๋ธํธ๋ฆฌ์๋ ๋ชจ๋ 30๋ณด๋ค ์์ ๊ฐ์ด ๋ค์ด๊ฐ ์๊ณ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ์๋ ๋ชจ๋ 30๋ณด๋ค ํฐ ๊ฐ์ด ๋ค์ด๊ฐ ์๋ค.
์ด๋ฌํ ๊ตฌ์กฐ๋ฅผ ์ ์งํ์ฑ๋ก ์ฝ์ ๊ณผ ์ญ์ ๋ฅผ ์งํํด์ผ ํ๋ค.
๋จผ์ ๋งํ์ง๋ง ์ฝ์ ์ ๊ฒฝ์ฐ๋ ๊ฐ๋จํ์ง๋ง ์ญ์ ์ ๊ฒฝ์ฐ ์กฐ๊ธ ๋ณต์กํ๋ค.
์ฝ์
์ ํ ๋ ๊ตฌ์กฐ๋ฅผ ์ ์งํด์ผ ํ๋ค๋ ์ ์ ์๊ฐํด๋ณด์. ๋ง์ฝ ์ (a)์ ์ํฉ์์ 21์ ๋ฃ๋๋ค๋ฉด ์ด๋๋ก ๊ฐ๊น?
21์ 30๋ณด๋ค ์๊ณ 20๋ณด๋ค ํฌ๊ณ 25๋ณด๋ค ์์ผ๋๊น 25์ ์ผ์ชฝ ์์์ด ๋ ๊ฒ์ด๋ค. ๋ด๊ฐ ์ง๊ธ ํ ๊ฒ์ ์ฝ๋๋ก ์ฎ๊ธฐ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
def __insertItem(self, tnode, newItem):
## ๋งจ ์ฒ์์ ๋ฃ์ด์ค ๋ ์๊ฐ
if tnode == None:
tnode = TreeNode(newItem, None, None)
elif (newItem < tnode.item):
tnode.left = self.__insertItem(tnode.left, newItem)
else: # newItem >= tnode.item
tnode.right = self.__insertItem(tnode.right, newItem)
return tnode
def insert(self, newItem):
self.__root = self.__insertItem(self.__root, newItem)
์ฌ๊ท์ ์ธ ๋ฐฉ์์ผ๋ก ๊ตฌ์ฑ๋ ์ฝ๋๋ผ ์กฐ๊ธ ์ดํด๊ฐ ์ด๋ ค์ธ ์๋ ์๋ค. ํ์ง๋ง ์ฝ๋๋ฅผ ์งค ๋ ์ด๊ฒ์ ์ดํดํ๋ ๊ฒ์ ๊ต์ฅํ ์ค์ํ๋ค.
๋ง์ฝ ๋ ธ๋๊ฐ ์ฝ์ ํด์ผ ํ๋ ์๋ฆฌ๊น์ง ๊ฐ๋ฉด ( ์์์ด ์์ผ๋ฉด ) ์ฌ๊ท๊ฐ ์ข ๋ฃ๋๋ ๊ตฌ์กฐ์ด๋ค.
๋ฃจํธ์์ ์์ํด์ ์ญ์ญ ํ๊ณ ๋ด๋ ค๊ฐ๋ ๊ตฌ์กฐ์ด๋ค.
๋ค์๊ณผ ๊ฐ์ด ์ด์ง ํธ๋ฆฌ์ ๊ตฌ์กฐ์ ๋ฐ๋ผ ๋น ๋์นญ์ ์ธ ํธ๋ฆฌ๊ฐ ์๊ธฐ๊ธฐ๋ ํ๋ค.
์ญ์ ๋ ํฌ๊ฒ 3๊ฐ์ง ๊ฒฝ์ฐ๋ก ๋๋๋ค.
Case 1: r ์ด ๋ฆฌํ๋
ธ๋์ธ ๊ฒฝ์ฐ
Case 2: r์ ์์์ด ํ๋์ธ ๊ฒฝ์ฐ
Case 3: r์ด ์์์ด 2์ธ ๊ฒฝ์ฐ
1,2 ๋ฒ์ ์ฝ๋ค. ๊ทธ๋ฅ ์์ ๊ฑฐ๋ ์์ค ํ์ ๋ถ๋ชจ ์์์ ์ฐ๊ฒฐํด์ฃผ๊ธฐ๋ง ํ๋ฉด ๋๋ค. ํ์ง๋ง 3๋ฒ์ ใ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋๋ค.
28์ ์์ ๋๋ฐ ์ ์๋ฆฌ์ ๋ฌด์์ ๋ฃ๋๋ ํ๋ ๋ฌธ์ ์ด๋ค.
์ ๊ธฐ์ ํ์๋์ด ์๋ 30์ด ๋ต์ด๋ค. ์ 30์ด๋๊ณ ๋ฌป๋๋ค๋ฉด ์ ์๋ฆฌ์๋ ์ค๋ฅธ ์ชฝ ์๋ธํธ๋ฆฌ ์ค์์ ์ ค ์์ ๊ฐ์ด ๋ค์ด๊ฐ์ผ ํ๋ค. ๋๋ฌธ์ 30์ธ ๊ฒ์ด๋ค. 30์ ์์ค ํ์๋ 30์ ์ค๋ฅธ ์ชฝ ์์๊ณผ 30์ ๋ถ๋ชจ๋ฅผ ์ฐ๊ฒฐ์์ผ ์ฃผ๊ธฐ๋ง ํ๋ฉด ๋๋ค. 30์ ๊ฒฝ์ฐ๋ ์๋ธํธ๋ฆฌ์์ ๊ฐ์ฅ ์์ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ ์ผ์ชฝ ์์์ด ์๋ ๊ฒฝ์ฐ์ด๋ค.
์ฝ๊ฒ ์๊ฐํด์ ๋จ๊ณ๋ฅผ ๋๋๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
def delete(self, x):
self.__root = self.__deleteItem(self.__root, x)
def __deleteItem(self, node, x):
if node == None:
return None
elif x == node.item:
node = self.__deleteNode(node)
elif x < node.item:
node.left = self.__deleteItem(node.left, x)
elif x > node.item:
node.right = self.__deleteItem(node.right, x)
return node
def __deleteNode(self, node):
# 3๊ฐ์ง ์ผ์ด์ค ์กด์ฌ! # 1. leaf 2. ์์ ํ๋ 3. ์์ ๋
if node.left == None and node.right == None:
return None
# ๋น ์๋ฆฌ ์ฑ์ธ ๋
ธ๋ ๋ฐํ
elif node.left == None:
return node.right
elif node.right == None:
return node.left
# ์ ค ๋ณต์กํ ์ผ์ด์ค / ๊ตฌ์กฐ๋ฅผ ์ ์งํ๋ฉฐ ์ญ์ ํด์ผํจ / ์์๊ฒ ์๋ก ๊ฐ์ผ์ง
else:
RightNodeItem, RightNode = self.__deleteMinItem(node.right)
node.item = RightNodeItem
node.right = RightNode
return node
def __deleteMinItem(self, node):
if node.left == None:
return node.item, node.right
else:
rtnItem, rtnNode = self.__deleteMinItem(node.left)
node.left = rtnNode
return rtnItem, node
์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
์กฐ๊ธ (๋ง์ด) ์ด๋ ต๋ค.
__deleteMinItem ์ฝ๋๊ฐ ์ค์ํ๋ค.
๋ฐํํ ๋ ์ ค ์์ ๊ฐ์ ์์ดํ ์ผ๋ก ๋ฐํํ๊ณ ์ค๋ฅธ ์ชฝ์ด ์๋ ๊ฒ์ ์ผ์ชฝ์ผ๋ก ์ฎ๊ฒจ์ฃผ๋๋ฐ ์ฌ๊ท์ ์ผ๋ก ๋์ด ์์ด์ ์ดํดํ๊ธฐ๊ฐ ์ด๋ ต๋ค.
ํ๋ํ๋ ๊ณฑ์น์ผ๋ฉด์ ์ดํดํด๋ณด๋๋ก ํ์.