
๋ชจ๋ ๋ ธ๋์ ๋ํด์ ์ผ์ชฝ ์๋ธํธ๋ฆฌ์ ์๋ ๋ฐ์ดํฐ๋ ๋ชจ๋ ํ์ฌ ๋ ธ๋์ ๊ฐ๋ณด๋ค ์๊ณ ์ค๋ฅธ์ชฝ์ ๋ชจ๋ ํฐ ์ฑ์ง์ ๋ง์กฑํ๋ ์ด์งํธ๋ฆฌ.
์ด์งํ์๊ณผ ์ ์ฌํ ์ ์ด ๋ง์ ์ด์งํ์๊ณผ ๋น๊ตํด๋ณด์์ต๋๋ค.
์ฅ์ : ๋ฐ์ดํฐ ์์์ ์ถ๊ฐ, ์ญ์ ๊ฐ ์ฉ์ดํ๋ค.
๋จ์ : ๊ณต๊ฐ ์์๊ฐ ํผ
๋ฐ์ดํฐ ํํ- ๊ฐ ๋
ธ๋๋ key, value ์์ผ๋ก ์ด๋ฃจ์ด์ ธ์๋ค.
key๋ฅผ ์ด์ฉํด์ ๊ฒ์ ๊ฐ๋ฅํ๋ค.
์ด์งํ์ํธ๋ฆฌ ์ฐ์ฐ์ค์ ๋๋ถ๋ถ ์ฐ์ฐ๋ค์ ๊ฐ๋จํ์ง๋ง remove ์ฐ์ฐ์ ์กฐ๊ธ ๋ณต์กํฉ๋๋ค.
๋ฃจํธ ๋ ธ๋ ๋๋ ๋ด๋ถ ๋ ธ๋๊ฐ ์ญ์ ๋๋ ๊ฒฝ์ฐ์๋ ๋ค๋ฅธ ๋ ธ๋๋ค์ ์ด๋ฆฌ์ ๋ฆฌ ์ฎ๊ฒจ์ ํธ๋ฆฌ์ ๋ชจ์ต์ ๊ฐ์ถ๋๋ก ๊ตฌ์กฐ๋ฅผ ์กฐ์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
remove๋ฅผ ๊ตฌํํ ๋ ์ํฉ์ ์ ๋ฆฌํด ๋ณด์์ต๋๋ค.
์ญ์ ๋๋ ๋
ธ๋๊ฐ
1. ๋ง๋จ (leaf) ๋
ธ๋์ธ ๊ฒฝ์ฐ
๊ทธ๋ฅ ๊ทธ ๋
ธ๋๋ฅผ ์์ ๋ฉด ๋๋ค.
โ ๋ถ๋ชจ ๋
ธ๋์ ๋งํฌ๋ฅผ ์กฐ์ (์ข? ์ฐ?)
โ ์ญ์ ๋๋ ๋
ธ๋ (X) ๊ฐ root node ์ธ ๊ฒฝ์ฐ๋ ํน๋ณ ์ฒ๋ฆฌ!
2.์์์ ํ๋ ๊ฐ์ง๊ณ ์๋ ๊ฒฝ์ฐ
์ญ์ ๋๋ ๋
ธ๋ ์๋ฆฌ์ ๊ทธ ์์์ ๋์ ๋ฐฐ์น
โ ์์์ด ์ผ์ชฝ? ์ค๋ฅธ์ชฝ?
โ ๋ถ๋ชจ ๋
ธ๋์ ๋งํฌ๋ฅผ ์กฐ์ (์ข? ์ฐ?)
โ ์ญ์ ๋๋ ๋
ธ๋ (X) ๊ฐ root node ์ธ ๊ฒฝ์ฐ, ๋์ ๋ค์ด์ค๋ ์์์ด ์๋ก root๊ฐ ๋จ
3.์์์ ๋ ๊ฐ์ง๊ณ ์๋ ๊ฒฝ์ฐ
์ญ์ ๋๋ ๋
ธ๋๋ณด๋ค ๋ฐ๋ก ๋ค์ (ํฐ) ํค๋ฅผ ๊ฐ์ง๋ ๋
ธ๋๋ฅผ ์ฐพ์
๊ทธ ๋
ธ๋๋ฅผ ์ญ์ ๋๋ ๋
ธ๋ ์๋ฆฌ์ ๋์ ๋ฐฐ์นํ๊ณ
์ด ๋
ธ๋๋ฅผ ๋์ ์ญ์
๋ค์์ remove์ ๋ํ ๊ตฌํ์ ๋๋ค.
def remove(self, key):
node, parent = self.lookup(key)
if node:
nChildren = node.countChildren()
# The simplest case of no children
if nChildren == 0:
# ๋ง์ฝ parent ๊ฐ ์์ผ๋ฉด
# node ๊ฐ ์ผ์ชฝ ์์์ธ์ง ์ค๋ฅธ์ชฝ ์์์ธ์ง ํ๋จํ์ฌ
# parent.left ๋๋ parent.right ๋ฅผ None ์ผ๋ก ํ์ฌ
# leaf node ์๋ ์์์ ํธ๋ฆฌ์์ ๋์ด๋ด์ด ์์ฑ๋๋ค.
if parent:
if node == parent.right:
parent.right = None
if node == parent.left:
parent.left = None
# ๋ง์ฝ parent ๊ฐ ์์ผ๋ฉด (node ๋ root ์ธ ๊ฒฝ์ฐ)
# self.root ๋ฅผ None ์ผ๋ก ํ์ฌ ๋น ํธ๋ฆฌ๋ก ๋ง๋ญ๋๋ค.
else:
self.root = None
# When the node has only one child
elif nChildren == 1:
# ํ๋ ์๋ ์์์ด ์ผ์ชฝ์ธ์ง ์ค๋ฅธ์ชฝ์ธ์ง๋ฅผ ํ๋จํ์ฌ
# ๊ทธ ์์์ ์ด๋ค ๋ณ์๊ฐ ๊ฐ๋ฆฌํค๋๋ก ํฉ๋๋ค.
if node.left:
direct = node.left
else:
direct = node.right
# ๋ง์ฝ parent ๊ฐ ์์ผ๋ฉด
# node ๊ฐ ์ผ์ชฝ ์์์ธ์ง ์ค๋ฅธ์ชฝ ์์์ธ์ง ํ๋จํ์ฌ
# ์์์ ๊ฐ๋ฆฌํจ ์์์ ๋์ node ์ ์๋ฆฌ์ ๋ฃ์ต๋๋ค.
if parent:
if node == parent.right:
parent.right = direct
else:
parent.left = direct
# ๋ง์ฝ parent ๊ฐ ์์ผ๋ฉด (node ๋ root ์ธ ๊ฒฝ์ฐ)
# self.root ์ ์์์ ๊ฐ๋ฆฌํจ ์์์ ๋์ ๋ฃ์ต๋๋ค.
else:
self.root = direct
# When the node has both left and right children
else:
parent = node
successor = node.right
# parent ๋ node ๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๊ณ ,
# successor ๋ node ์ ์ค๋ฅธ์ชฝ ์์์ ๊ฐ๋ฆฌํค๊ณ ์์ผ๋ฏ๋ก
# successor ๋ก๋ถํฐ ์ผ์ชฝ ์์์ ๋งํฌ๋ฅผ ๋ฐ๋ณตํ์ฌ ๋ฐ๋ผ๊ฐ์ผ๋ก์จ
# ์ํ๋ฌธ์ด ์ข
๋ฃํ ๋ successor ๋ ๋ฐ๋ก ๋ค์ ํค๋ฅผ ๊ฐ์ง ๋
ธ๋๋ฅผ,
# ๊ทธ๋ฆฌ๊ณ parent ๋ ๊ทธ ๋
ธ๋์ ๋ถ๋ชจ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ์ฐพ์๋
๋๋ค.
while successor.left:
parent = successor
successor = successor.left
# ์ญ์ ํ๋ ค๋ ๋
ธ๋์ธ node ์ successor ์ key ์ data ๋ฅผ ๋์
ํฉ๋๋ค.
node.key = successor.key
node.data = successor.data
# ์ด์ , successor ๊ฐ parent ์ ์ผ์ชฝ ์์์ธ์ง ์ค๋ฅธ์ชฝ ์์์ธ์ง๋ฅผ ํ๋จํ์ฌ
# ๊ทธ์ ๋ฐ๋ผ parent.left ๋๋ parent.right ๋ฅผ
# successor ๊ฐ ๊ฐ์ง๊ณ ์๋ (์์ ์๋ ์์ง๋ง) ์์์ ๊ฐ๋ฆฌํค๋๋ก ํฉ๋๋ค.
if successor.key == parent.left.key:
parent.left = successor.right
else:
parent.right = successor.right
return True
๐ก์ด์งํ์ํธ๋ฆฌ๊ฐ ๋ง์ฝ์ ํ์ค๋ก ๋์ด์ ์์ ๋, ํ์ ์ฐ์ฐ ๋ณต์ก๋๋ ์ ํ ํ์ ๋ณต์ก๋์ ๋์ผํด ์ง๋ค๋ ๋จ์ ์ ์์๋ค.