ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๋ฐ˜์‘ํ˜•

์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ๋Š” ์ด์ง„ ํŠธ๋ฆฌ์˜ ์ผ์ข…์œผ๋กœ ๋ชจ๋“  ๋…ธ๋“œ์— ๋Œ€ํ•ด์„œ ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋Š” ๋ชจ๋‘ ํ˜„์žฌ ๋…ธ๋“œ์˜ ๊ฐ’๋ณด๋‹ค ์ž‘๊ณ  ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋Š” ๋ชจ๋‘ ํ˜„์žฌ ๋…ธ๋“œ์˜ ๊ฐ’๋ณด๋‹ค ํฐ ์„ฑ์งˆ์„ ๋งŒ์กฑํ•˜๋Š” ์ด์ง„ํŠธ๋ฆฌ์ด๋‹ค. ๋‹จ ์ค‘๋ณต๋˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ์—†๋Š”๊ฒƒ์œผ๋กœ ๊ฐ€์ •ํ•œ๋‹ค.

์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ๋Š” ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰์„ ํ•˜๋Š”๋ฐ ์œ ์šฉํ•˜๊ฒŒ ์ด์šฉ๋œ๋‹ค. ์ด๋Ÿฌํ•œ ํƒ์ƒ‰๋ฒ•์€ ์ด์ง„ํƒ์ƒ‰๊ณผ ๋น„์Šทํ•ด๋ณด์ธ๋‹ค,

 

 

 

 

์ •๋ ฌ๋œ ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ์ด์ง„ ํƒ์ƒ‰๊ณผ ๋น„๊ต

์ •๋ ฌ๋œ ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ์ด์ง„ ํƒ์ƒ‰
ํŠธ๋ฆฌ๋ฅผ ์ด์šฉํ•œ ์ด์ง„ ํƒ์ƒ‰

์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ๋ฅผ ์ด์šฉํ–ˆ์„ ๋•Œ๋Š” ๋ฐฐ์—ด์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ ๋ณด๋‹ค ๋ฐ์ดํ„ฐ์˜ ์ถ”๊ฐ€, ์‚ญ์ œ๊ฐ€ ์šฉ์ดํ•˜๋‹ค. ํ•˜์ง€๋งŒ ๊ณต๊ฐ„์„ ๋งŽ์ด ์ฐจ์ง€ํ•œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. ๋˜ ํ•ญ์ƒ O(logN)์˜ ๋ณต์žก๋„๋ฅผ ๊ฐ–๊ณ ์žˆ์ง„ ์•Š๋Š”๋‹ค.

 

 

 

 

์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ์˜ ์ถ”์ƒ์  ์ž๋ฃŒ๊ตฌ์กฐ

๋ฐ์ดํ„ฐ ํ‘œํ˜„ - ๊ฐ ๋…ธ๋“œ๋Š” (key, value)์˜ ์Œ์œผ๋กœ ํ‘œํ˜„ํ•œ๋‹ค. ํ‚ค๋ฅผ ์ด์šฉํ•ด์„œ ๊ฒ€์ƒ‰๊ฐ€๋Šฅ, ๋ณด๋‹ค ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๋ ˆ์ฝ”๋“œ๋กœ ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ˆซ์ž๊ฐ€ key, ์ด๋ฆ„์ด value

์—ฐ์‚ฐ์˜ ์ •์˜

  • insert(key, data) - ํŠธ๋ฆฌ์— ์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ ์›์†Œ๋ฅผ ์ถ”๊ฐ€
  • remove(key) - ํŠน์ • ์›์†Œ๋ฅผ ํŠธ๋ฆฌ๋กœ ๋ถ€ํ„ฐ ์‚ญ์ œ
  • lookup(key) - ํŠน์ • ์›์†Œ๋ฅผ ๊ฒ€์ƒ‰
  • inorder() - ํ‚ค์˜ ์ˆœ์„œ๋Œ€๋กœ ๋ฐ์ดํ„ฐ ์›์†Œ๋ฅผ ๋‚˜์—ด
  • min(), max() - ์ตœ์†Œ ํ‚ค, ์ตœ๋Œ€ ํ‚ค๋ฅผ ๊ฐ€์ง€๋Š” ์›์†Œ๋ฅผ ๊ฐ๊ฐ ํƒ์ƒ‰

 

 

 

์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ์— ์›์†Œ ์‚ฝ์ž…

 

 

์ฝ”๋“œ ๊ตฌํ˜„ - ์ดˆ๊ธฐํ™”

class Node:
    # ์ดˆ๊ธฐํ™”
    def __init__(self, key, data):
        self.key = key
        self.data = data
        self.left = None
        self.right = None
        
class BinSearchTree:
    # ์ €๋ฒˆ์—๋Š” ์ธ์ž๋ฅผ ์ฃผ์—ˆ๋Š”๋ฐ ์ด๋ฒˆ์—๋Š” none์œผ๋กœ ์ดˆ๊ธฐํ™”
    def __init__(self):
        self.root = None

 

 

 

์ฝ”๋“œ ๊ตฌํ˜„ - inorder traversal

class Node:

    # ์ด๋ฒˆ์—๋Š” ๋…ธ๋“œ๋“ค์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋ฆฌํ„ดํ•œ๋‹ค.
    def inorder(self):
        traversal = []
        if self.left:
            traversal += self.left.inorder()
        traversal.append(self)
        if self.right:
            traversal += self.right.inorder()
        return traversal


class BinSearchTree:

    def inorder(self):
        if self.root:
            return self.root.inorder()
        else:
            return []

 

 

 

์ฝ”๋“œ ๊ตฌํ˜„ - min(), max()

# ๋…ธ๋“œ ํด๋ž˜์Šค
class Node:
    
    def min(self):
        if self.left:
            return self.left.min()
        else:
            return self

    def max(self):
        if self.right:
            return self.right.max()
        else:
            return self
            
            
            
# ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ ํด๋ž˜์Šค
class BinSearchTree:
    
    def min(self):
        # ๋ฃจํŠธ ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜๋ฉด
        if self.root:
            return self.root.min()
        else:
            return None

    def max(self):
        if self.root:
            return self.root.max()
        else:
            return None

 

 

 

์ฝ”๋“œ ๊ตฌํ˜„ - lookup()

  • ์ž…๋ ฅ์ธ์ž - ์ฐพ์œผ๋ ค๋Š” ๋Œ€์ƒ ํ‚ค
  • ๋ฆฌํ„ด - ์ฐพ์€ ๋…ธ๋“œ์™€ ๊ทธ๊ฒƒ์˜ ๋ถ€๋ชจ ๋…ธ๋“œ(์‚ญ์ œ์— ์ด์šฉ๋จ) ๊ฐ๊ฐ ์—†์œผ๋ฉด None์œผ๋กœ
# ๋…ธ๋“œ ํด๋ž˜์Šค
class Node:

    # parent ์ธ์ž๊ฐ€ ์ฃผ์–ด์ง€์ง€์•Š์œผ๋ฉด None์œผ๋กœ ์ƒ๊ฐํ•˜๋ผ๋Š” ๋ง
    def lookup(self, key, parent=None):
        # ์ง€๊ธˆ ๋ฐฉ๋ฌธ๋œ ๋…ธ๋“œ(self.key)๋ณด๋‹ค ํƒ์ƒ‰ํ•˜๋ ค๋Š” ํ‚ค๊ฐ€ ์ž‘์œผ๋ฉด ์™ผ์ชฝ์œผ๋กœ ๊ฐ€์•ผํ•จ
        if key < self.key:
            # ์™ผ์ชฝ ์ž์‹์ด ์žˆ์„ ๋•Œ
            if self.left:
                # ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœ
                return self.left.lookup(key, self)
            else:
                # ์ฐพ์œผ๋ ค๋Š” ํ‚ค๊ฐ€ ์—†๊ตฌ๋‚˜
                return None, None
        
        # ์ง€๊ธˆ ๋ฐฉ๋ฌธ๋œ ๋…ธ๋“œ๋ณด๋‹ค ์ฐพ์œผ๋ ค๋Š” ํ‚ค๊ฐ€ ํฌ๋ฉด ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ฐ€์•ผํ•จ
        elif key > self.key:
            # ์˜ค๋ฅธ์ชฝ ์ž์‹์ด ์žˆ์„ ๋•Œ
            if self.right:
                return self.right.lookup(key, self)
            else:
                return None, None
        
        # ์ฐพ์•˜๋‹ค ํ•ด๋‹น ๋…ธ๋“œ!
        else:
            return self, parent
            
            
# ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ ํด๋ž˜์Šค
class BinSearchTree:

    def lookup(self, key):
        if self.root:
            return self.root.lookup(key)
        else:
            return None, None            


 

 

 

์ฝ”๋“œ ๊ตฌํ˜„ - insert()

  • ์ž…๋ ฅ ์ธ์ž - ํ‚ค, ๋ฐ์ดํ„ฐ ์›์†Œ
  • ๋ฆฌํ„ด - ์—†์Œ
class Node:
    def insert(self, key, data):
        # ์ฐพ์œผ๋ ค๋Š” ํ‚ค๊ฐ€ ํ•ด๋‹น๋…ธ๋“œ๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ ์™ผ์ชฝ์œผ๋กœ
        if key < self.key:
            # ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ
            if self.left:
                self.left.insert(key, data)
            # ์กด์žฌํ•˜์ง€์•Š์œผ๋ฉด ๋…ธ๋“œ๋ฅผ ๋‹จ๋‹ค.
            else:
                self.left = Node(key, data)
                
        # ์ฐพ์œผ๋ ค๋Š” ํ‚ค๊ฐ€ ํ•ด๋‹น ๋…ธ๋“œ๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ ์˜ค๋ฅธ์ชฝ์œผ๋กœ        
        elif key > self.key:
            # ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ 
            if self.right:
                self.right.insert(key, data)
            # ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ๋…ธ๋“œ๋ฅผ ๋‹จ๋‹ค.
            else:
                self.right = Node(key, data)
                
        # ์ค‘๋ณต๋œ ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ์—๋Ÿฌ ๋ฐœ์ƒ
        else:
            print("์ค‘๋ณต๋œ ๋…ธ๋“œ๊ฐ€ ์กด์žฌ")

        return True
        
        
class BinSearchTree:
    # ๋…ธ๋“œ ์‚ฝ์ž…
    def insert(self, key, data):
        # ์กด์žฌํ•˜๋Š” ํŠธ๋ฆฌ๋ผ๋ฉด
        if self.root:
            self.root.insert(key,data)
        
        # ํŠธ๋ฆฌ๊ฐ€ ์กด์žฌํ•˜์ง€์•Š๋‹ค๋ฉด ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ๋ฃจํŠธ์— ๋„ฃ๋Š”๋‹ค.
        else:
            self.root = Node(key, data)
            
            

 

 

 

์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ์—์„œ ์›์†Œ ์‚ญ์ œ

  • ํ‚ค(key)๋ฅผ ์ด์šฉํ•ด์„œ ๋…ธ๋“œ๋ฅผ ์ฐพ๋Š”๋‹ค. ๋งŒ์•ฝ ํ•ด๋‹น ํ‚ค์˜ ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฉด ์‚ญ์ œํ•  ๊ฒƒ์ด ์—†์Œ, ๋…ธ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ์ฐพ์€ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ ๋…ธ๋“œ๋„ ์•Œ๊ณ ์žˆ์–ด์•ผํ•œ๋‹ค.
  • ์ฐพ์€ ๋…ธ๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ ๋„ ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ ์„ฑ์งˆ์„ ๋งŒ์กฑํ•˜๋„๋ก ํŠธ๋ฆฌ์˜ ๊ตฌ์กฐ๋ฅผ ์ •๋ฆฌํ•œ๋‹ค (๋ถ€๋ชจ๋…ธ๋“œ๋ฅผ ์•Œ์•„์•ผํ•˜๋Š” ์ด์œ )

 

์›์†Œ ์‚ญ์ œ์˜ ์ธํ„ฐํŽ˜์ด์Šค ์„ค๊ณ„

  • ์ž…๋ ฅ - ํ‚ค(key)
  • ์ถœ๋ ฅ - ์‚ญ์ œํ•œ ๊ฒฝ์šฐ True, ํ•ด๋‹น ํ‚ค์˜ ๋…ธ๋“œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ False

 

์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ ๊ตฌ์กฐ์˜ ์œ ์ง€

์‚ญ์ œ๋˜๋Š” ๋…ธ๋“œ๊ฐ€

  1. ๋ง๋‹จ(leaf)๋…ธ๋“œ์ธ ๊ฒฝ์šฐ -> ๊ทธ๋ƒฅ ๊ทธ ๋…ธ๋“œ๋ฅผ ์—†์• ๋ฉด ๋จ ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ๋งํฌ ์กฐ์ •(์ขŒ? ์šฐ?)
  2. ์ž์‹์„ ํ•˜๋‚˜ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ -> ์‚ญ์ œ๋˜๋Š” ๋…ธ๋“œ ์ž๋ฆฌ์— ๊ทธ ์ž์‹์„ ๋Œ€์‹  ๋ฐฐ์น˜ํ•œ๋‹ค. ์ž์‹์ด ์™ผ์ชฝ์ธ์ง€ ์˜ค๋ฅธ์ชฝ์ธ์ง€, ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ๋งํฌ๋ฅผ ์กฐ์ •(์ขŒ? ์šฐ?)
  3. ์ž์‹์„ ๋‘˜ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ -> ์‚ญ์ œ๋˜๋Š” ๋…ธ๋“œ๋ณด๋‹ค ๋ฐ”๋กœ ๋‹ค์Œ (ํฐ) ํ‚ค๋ฅผ ๊ฐ€์ง€๋Š” ๋…ธ๋“œ๋ฅผ ์ฐพ์•„ ๊ทธ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œ๋˜๋Š” ๋…ธ๋“œ ์ž๋ฆฌ์— ๋Œ€์‹  ๋ฐฐ์น˜ํ•˜๊ณ  ์ด ๋…ธ๋“œ๋ฅผ ๋Œ€์‹  ์‚ญ์ œํ•œ๋‹ค.

 

 

์›์†Œ ์‚ญ์ œ์˜ ๊ฒฝ์šฐ 1 - ์‚ญ์ œํ•˜๋ ค๋Š” ๋…ธ๋“œ๊ฐ€ ๋ง๋‹จ(leaf)๋…ธ๋“œ์ผ ๋•Œ

 

 

์›์†Œ ์‚ญ์ œ์˜ ๊ฒฝ์šฐ 2 - ์ž์‹์ด ํ•˜๋‚˜์ธ ๋…ธ๋“œ์˜ ์‚ญ์ œ

 

์›์†Œ ์‚ญ์ œ์˜ ๊ฒฝ์šฐ3 - ์ž์‹์ด ๋‘˜์ธ ๋…ธ๋“œ์˜ ์‚ญ์ œ

์ƒ๊ฐ์„ ๋งŽ์ด ํ•ด๋ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ๋‹ค. ์˜ˆ์ œ๋กœ ์ƒ๊ฐ์„ ํ•ด๋ณด์ž.

๋…ธ๋“œ 5๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ

 

 

๋…ธ๋“œ 8์„ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ

 

class Node:
    # ์ž์‹์„ ์„ธ์–ด๋ณด์ž
    def countChildren(self):
        count = 0
        if self.left:
            count += 1
        if self.right:
            count += 1
        return count
        
        
class BinSearchTree:
    # ๋…ธ๋“œ ์‚ญ์ œ
    def remove(self, key):
        # ์‚ญ์ œํ•˜๋ ค๋Š” ๋…ธ๋“œ์™€ p๋ฅผ ๊ฒ€์ƒ‰
        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 parent.left == node:
                        parent.left = None
                    if parent.right == node:
                        parent.right = None

                # ๋งŒ์•ฝ parent ๊ฐ€ ์—†์œผ๋ฉด (node ๋Š” root ์ธ ๊ฒฝ์šฐ)
                # self.root ๋ฅผ None ์œผ๋กœ ํ•˜์—ฌ ๋นˆ ํŠธ๋ฆฌ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
                else:
                    self.root = None


            # When the node has only one child
            elif nChildren == 1:
                # ํ•˜๋‚˜ ์žˆ๋Š” ์ž์‹์ด ์™ผ์ชฝ์ธ์ง€ ์˜ค๋ฅธ์ชฝ์ธ์ง€๋ฅผ ํŒ๋‹จํ•˜์—ฌ
                # ๊ทธ ์ž์‹์„ ์–ด๋–ค ๋ณ€์ˆ˜๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
                if node.left:
                    temp = node.left
                else:
                    temp = node.right

                # ๋งŒ์•ฝ parent ๊ฐ€ ์žˆ์œผ๋ฉด
                # node ๊ฐ€ ์™ผ์ชฝ ์ž์‹์ธ์ง€ ์˜ค๋ฅธ์ชฝ ์ž์‹์ธ์ง€ ํŒ๋‹จํ•˜์—ฌ
                # ์œ„์—์„œ ๊ฐ€๋ฆฌํ‚จ ์ž์‹์„ ๋Œ€์‹  node ์˜ ์ž๋ฆฌ์— ๋„ฃ์Šต๋‹ˆ๋‹ค.
                if parent:
                    if parent.left == node:
                        parent.left = temp
                    else:
                        parent.right = temp
                
                # ๋งŒ์•ฝ parent ๊ฐ€ ์—†์œผ๋ฉด (node ๋Š” root ์ธ ๊ฒฝ์šฐ)
                # self.root ์— ์œ„์—์„œ ๊ฐ€๋ฆฌํ‚จ ์ž์‹์„ ๋Œ€์‹  ๋„ฃ์Šต๋‹ˆ๋‹ค.
                else:
                    self.root = temp
            
            # 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 parent.left == successor:
                    parent.left = successor.right
                else:
                    parent.right = successor.right
                    

            return True

        else:
            return False

์–ด๋–ป๊ฒŒ ํ’€๊ธดํ–ˆ์ง€๋งŒ ๋„ˆ๋ฌด ์–ด๋ ต๋„ค,, ๋งˆ์ง€๋ง‰์— successor๊ฐ€ parent์˜ ์™ผ์ชฝ ์ž์‹์ธ์ง€ ์˜ค๋ฅธ์ชฝ ์ž์‹์ธ์ง€ ํŒ๋‹จํ•˜๋Š” ๋ถ€๋ถ„์ด ์ž˜ ์ดํ•ด๊ฐ€ ๊ฐ€์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ฆผ ๊ทธ๋ ค์„œ ๋Œ์•„๊ฐ€๋Š”๊ฑธ ํ™•์ธํ•ด๋ณด๋‹ˆ ํ•ด๊ฒฐ๋๋‹ค. ๋„ˆ๋ฌด ๋ณต์žกํ•˜๊ณ  ํ—ท๊ฐˆ๋ฆฌ๋Š”๊ตฌ๋งŒ

 

 

 

 

 

์ด์ง„ํŠธ๋ฆฌ๊ฐ€ ํšจ์œจ์ ์ด์ง€ ๋ชปํ•œ ๊ฒฝ์šฐ

์ˆœ์„œ๋Œ€๋กœ ์‚ฝ์ž…ํ•˜๋Š” ๊ฒฝ์šฐ์— ํšจ์œจ์ ์ด์ง€ ๋ชปํ•˜๋‹ค. -> ํ•œ์ชฝ์œผ๋กœ ์น˜์šฐ์นœ ๋ชจ์–‘

 

 

 

 

๋ณด๋‹ค ๋‚˜์€ ์„ฑ๋Šฅ์„ ๋ณด์ด๋Š” ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ๋“ค (์ฐธ๊ณ )

๋†’์ด์˜ ๊ท ํ˜•์„ ์œ ์ง€ํ•จ์œผ๋กœ์จ O(logN)์˜ ํƒ์ƒ‰ ๋ณต์žก๋„๋ฅผ ๋ณด์žฅํ•œ๋‹ค. ์‚ฝ์ž…, ์‚ญ์ œ ์—ฐ์‚ฐ์ด ๋ณด๋‹ค ๋ณต์žกํ•จ 

AVL tree - https://ko.wikipedia.org/wiki/AVL_ํŠธ๋ฆฌ 

 

AVL ํŠธ๋ฆฌ - ์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „

์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „. AVL ํŠธ๋ฆฌ(AVL tree)๋Š” ๊ฐ€์žฅ ์ดˆ๊ธฐ์— ๋‚˜์˜จ ๊ท ํ˜• ์žกํžŒ(balanced) ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ์ด๋‹ค. 1962๋…„ G.M. Adelson-Velskii์™€ E.M. Landis ๊ฐ€ ๊ทธ๋“ค์˜ ๋…ผ๋ฌธ "An algorithm for the organization of informat

ko.wikipedia.org

Red black tree - https://ko.wikipedia.org/wiki/๋ ˆ๋“œ-๋ธ”๋ž™_ํŠธ๋ฆฌ 

 

๋ ˆ๋“œ-๋ธ”๋ž™ ํŠธ๋ฆฌ - ์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „

์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „. ๋ ˆ๋“œ-๋ธ”๋ž™ ํŠธ๋ฆฌ(Red-black tree)๋Š” ์ž๊ฐ€ ๊ท ํ˜• ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ(self-balancing binary search tree)๋กœ์จ, ๋Œ€ํ‘œ์ ์œผ๋กœ๋Š” ์—ฐ๊ด€ ๋ฐฐ์—ด ๋“ฑ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์“ฐ์ด๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋‹ค. 1978๋…„ ๏ฟฝ๏ฟฝ

ko.wikipedia.org

 

๋ฐ˜์‘ํ˜•
๋Œ“๊ธ€