YS's develop story

Tree (ํŠธ๋ฆฌ) ์ •๋ฆฌ ๋ณธ๋ฌธ

Data Structure

Tree (ํŠธ๋ฆฌ) ์ •๋ฆฌ

Yusang 2021. 7. 27. 09:44

๐Ÿ‘จ๐Ÿผ‍๐Ÿ’ป Tree (ํŠธ๋ฆฌ) ์ •๋ฆฌ With Python

๐Ÿฅ Tree๋ž€?

Node์™€ Branch๋ฅผ ์ด์šฉํ•ด์„œ Cycle์„ ์ด๋ฃจ์ง€ ์•Š๋„๋ก ๊ตฌ์„ฑํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

 

๐Ÿ‹ ๊ด€๋ จ ์šฉ์–ด

Node          : ํŠธ๋ฆฌ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ธฐ๋ณธ ์š”์†Œ

Root Node   : ํŠธ๋ฆฌ์˜ ์ตœ์ƒ์œ„ ๋…ธ๋“œ

Level           : ์ตœ์ƒ์œ„ ๋…ธ๋“œ๋ฅผ Level 0์ด๋ผ๊ณ  ํ–ˆ์„ ๋•Œ, ํ•˜์œ„ Branch๋กœ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ์˜ ๊นŠ์ด๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

Parent Node : ์–ด๋–ค ๋…ธ๋“œ์˜ ๋ถ€๋ชจ ๋…ธ๋“œ

Child Node   : ์–ด๋–ค ๋…ธ๋“œ์˜ ์ž์‹ ๋…ธ๋“œ

Leaf Node    : Child Node๊ฐ€ ํ•˜๋‚˜๋„ ์—†๋Š” ๋…ธ๋“œ

Sibling         : ๋™์ผํ•œ Parent Node๋ฅผ ๊ฐ€์ง€๋Š” ๋…ธ๋“œ

Depth          : ํŠธ๋ฆฌ์—์„œ Node๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ Level (์œ„ ์‚ฌ์ง„์—์„œ์˜ Depth๋Š” 2)

 

๐ŸŠ ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ

์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ๋Š” ์ด์ง„ํŠธ๋ฆฌ์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉด์„œ

์™ผ์ชฝ ๋…ธ๋“œ๋Š” ํ•ด๋‹น ๋…ธ๋“œ๋ณด๋‹ค ์ž‘์€ ๊ฐ’, ์˜ค๋ฅธ์ชฝ ๋…ธ๋“œ๋Š” ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํŠธ๋ฆฌ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

 

๐Ÿ‰ ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ์˜ ์žฅ์ 

๋ฐฐ์—ด๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ ๋ฐ์ดํ„ฐ ํƒ์ƒ‰ ์†๋„๊ฐ€ ์›”๋“ฑํžˆ ๋น ๋ฅธ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿˆ ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ ๊ตฌํ˜„ With Python

class Node:
    def __init__(self, value):
        self.value = value
        self.left = None
        self.right = None


class Tree:
    def __init__(self, head):
        self.head = head

    def insert(self, value):
        self.node = self.head
        while True:
            if value < self.node.value:
                if self.node.left != None:
                    self.node = self.node.left
                else:
                    self.node.left = Node(value)
                    break
            else:
                if self.node.right !=None:
                    self.node = self.node.right
                else:
                    self.node.right = Node(value)
                    break

    def search(self,value):
        self.node = self.head
        while self.node:
            if self.node.value == value:
                return True
            elif value < self.node.value:
                self.node= self.node.left
            else :
                self.node = self.node.right
        return False

 

๐Ÿฅฅ ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ ์‚ญ์ œ ๊ตฌํ˜„

์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ์˜ ์‚ญ์ œ๋Š” ๋งค์šฐ ๋ณต์žกํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฝ์šฐ๋ฅผ ๋‚˜๋ˆ ์„œ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ํŽธํ•ฉ๋‹ˆ๋‹ค.

 

Case 1 : Child Node๊ฐ€ ์—†๋Š” Node

  1. ์‚ญ์ œํ•  Node์˜ Parent Node๊ฐ€ ์‚ญ์ œํ•  Node๋ฅผ ๊ฐ€๋ฆฌํ‚ค์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

 

Case 2 : Child Node๊ฐ€ ํ•˜๋‚˜์ธ Node ์‚ญ์ œ

  1. ์‚ญ์ œํ•  Node์˜ Parent Node๊ฐ€ ์‚ญ์ œํ•  Node์˜ Child Node๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

 

Case 3 : Child Node๊ฐ€ ๋‘ ๊ฐœ์ธ Node ์‚ญ์ œ

  1. ์‚ญ์ œํ•  Node์˜ ์˜ค๋ฅธ์ชฝ ์ž์‹ ์ค‘, ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ์‚ญ์ œํ•  Node์˜ Parent Node๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  2. ์‚ญ์ œํ•  Node์˜ ์™ผ์ชฝ ์ž์‹ ์ค‘, ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ์‚ญ์ œํ•  Node์˜ Parent Node๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿฅž ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ ์‚ญ์ œ ์ฝ”๋“œ ๊ตฌํ˜„

def delete(self, value):
        # ์‚ญ์ œํ•  ๋…ธ๋“œ ํƒ์ƒ‰
        searched = False
        self.current_node = self.head
        self.parent = self.head
        while self.current_node:
            if self.current_node.value == value:
                searched = True
                break
            elif value < self.current_node.value:
                self.parent = self.current_node
                self.current_node = self.current_node.left
            else:
                self.parent = self.current_node
                self.current_node = self.current_node.right

        if searched == False:
            return False    

        # case1
        if  self.current_node.left == None and self.current_node.right == None:
            if value < self.parent.value:
                self.parent.left = None
            else:
                self.parent.right = None
        
        # case2
        elif self.current_node.left != None and self.current_node.right == None:
            if value < self.parent.value:
                self.parent.left = self.current_node.left
            else:
                self.parent.right = self.current_node.left
        elif self.current_node.left == None and self.current_node.right != None:
            if value < self.parent.value:
                self.parent.left = self.current_node.right
            else:
                self.parent.right = self.current_node.right        
        
        # case 3
        elif self.current_node.left != None and self.current_node.right != None:
            # case3-1
            if value < self.parent.value:
                self.change_node = self.current_node.right
                self.change_node_parent = self.current_node.right
                while self.change_node.left != None:
                    self.change_node_parent = self.change_node
                    self.change_node = self.change_node.left
                if self.change_node.right != None:
                    self.change_node_parent.left = self.change_node.right
                else:
                    self.change_node_parent.left = None
                self.parent.left = self.change_node
                self.change_node.right = self.current_node.right
                self.change_node.left = self.change_node.left
            # case 3-2
            else:
                self.change_node = self.current_node.right
                self.change_node_parent = self.current_node.right
                while self.change_node.left != None:
                    self.change_node_parent = self.change_node
                    self.change_node = self.change_node.left
                if self.change_node.right != None:
                    self.change_node_parent.left = self.change_node.right
                else:
                    self.change_node_parent.left = None
                self.parent.right = self.change_node
                self.change_node.right = self.current_node.right
                self.change_node.left = self.current_node.left

        return True

 

๐Ÿฅญ ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ ์‹œ๊ฐ„ ๋ณต์žก๋„

์œ„ ์‚ฌ์ง„ ๊ฐ™์ด ํŠธ๋ฆฌ๊ฐ€ ๊ท ํ˜• ์žกํ˜€ ์žˆ์ง€ ์•Š์„ ๋•Œ O(n)์˜ ์„ฑ๋Šฅ์„ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค.

Comments