[์ž๋ฃŒ๊ตฌ์กฐ ๐Ÿ—‚] ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ

ํŒŒ์ดํ†จ์น˜ยท2022๋…„ 5์›” 26์ผ
0

๋Œ€ํ•™์ˆ˜์—…

๋ชฉ๋ก ๋ณด๊ธฐ
21/32
post-custom-banner

๐Ÿ‘€ ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ

์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ๋ฐฐ์šฐ๊ธฐ ์ „์— ์™œ ์“ฐ๋Š”์ง€ ์ƒ๊ฐํ•ด๋ณด์•„์•ผ ํ•œ๋‹ค. ์™œ ์“ฐ๋Š”์ง€ ์งˆ๋ฌธ์„ ํ•˜๊ณ  ๊ฑฐ๊ธฐ์— ๋Œ€ํ•œ ๋‹ต์„ ๋‚ธ ํ›„์— ๋ฐฐ์›Œ์•ผ ํ•œ๋‹ค.

์™œ ์“ฐ๋ƒ๊ณ  ๋ฌป๋Š”๋‹ค๋ฉด ๊ฐ’์„ ์ž˜ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค. ๋ฐฐ์—ด ์ธ๋ฑ์Šค์˜ ๊ฒฝ์šฐ์— ๊ฒ€์ƒ‰์— ๋กœ๊ทธ 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์˜ ๊ฒฝ์šฐ๋Š” ์„œ๋ธŒํŠธ๋ฆฌ์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์— ์™ผ์ชฝ ์ž์‹์ด ์—†๋Š” ๊ฒฝ์šฐ์ด๋‹ค.

์‰ฝ๊ฒŒ ์ƒ๊ฐํ•ด์„œ ๋‹จ๊ณ„๋ฅผ ๋‚˜๋ˆ„๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’ ์ฐพ๊ธฐ.
  2. ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’ ์‚ญ์ œ ํ›„ ์›ํ•˜๋Š” ๊ฐ’ ์ž๋ฆฌ์— ๋„ฃ๊ธฐ.
  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 ์ฝ”๋“œ๊ฐ€ ์ค‘์š”ํ•˜๋‹ค.

๋ฐ˜ํ™˜ํ•  ๋•Œ ์ ค ์ž‘์€ ๊ฐ’์„ ์•„์ดํ…œ์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์˜ค๋ฅธ ์ชฝ์ด ์žˆ๋˜ ๊ฒƒ์„ ์™ผ์ชฝ์œผ๋กœ ์˜ฎ๊ฒจ์ฃผ๋Š”๋ฐ ์žฌ๊ท€์ ์œผ๋กœ ๋˜์–ด ์žˆ์–ด์„œ ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค.

ํ•˜๋‚˜ํ•˜๋‚˜ ๊ณฑ์”น์œผ๋ฉด์„œ ์ดํ•ดํ•ด๋ณด๋„๋ก ํ•˜์ž.

profile
์•ˆ์•Œ๋žด์คŒ
post-custom-banner

0๊ฐœ์˜ ๋Œ“๊ธ€