- GIT
- MAKE US
- Java
- @CreatedDate
- OpenAPI
- Rp2๊ธฐ
- Quick Sort
- C++
- spring์ผ๋ก https ์ ์ฉ
- spring ์์ ๋ก๊ทธ์ธ
- RP 2๊ธฐ
- DATABASE
- ์์คํ ์ํํธ์จ์ด
- SQL
- datagrip
- Unity
- ํจ์คํธ์บ ํผ์คX์ผ๋์
- node js
- merge sort
- MethodArgumentNotValidException
- spring ๊ตฌ๊ธ ์์ ๋ก๊ทธ์ธ
- java error
- mysql
- ๋ฆฌ๋ ์ค ๋ช ๋ น์ด
- Data Structure
- ๊ตฌ๊ธ ์์ ๋ก๊ทธ์ธ
- SSL
- docker
- aligoapi
- Spring
YS's develop story
Tree (ํธ๋ฆฌ) ์ ๋ฆฌ ๋ณธ๋ฌธ
๐จ๐ผ๐ป 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
- ์ญ์ ํ Node์ Parent Node๊ฐ ์ญ์ ํ Node๋ฅผ ๊ฐ๋ฆฌํค์ง ์๋๋ก ํฉ๋๋ค.
Case 2 : Child Node๊ฐ ํ๋์ธ Node ์ญ์
- ์ญ์ ํ Node์ Parent Node๊ฐ ์ญ์ ํ Node์ Child Node๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ํฉ๋๋ค.
Case 3 : Child Node๊ฐ ๋ ๊ฐ์ธ Node ์ญ์
- ์ญ์ ํ Node์ ์ค๋ฅธ์ชฝ ์์ ์ค, ๊ฐ์ฅ ์์ ๊ฐ์ ์ญ์ ํ Node์ Parent Node๊ฐ ๊ฐ๋ฆฌํค๋๋ก ํฉ๋๋ค.
- ์ญ์ ํ 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)์ ์ฑ๋ฅ์ ๋ณด์ฌ ์ค๋๋ค.
'Data Structure' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Graph (๊ทธ๋ํ) ์ ๋ฆฌ (0) | 2021.07.29 |
---|---|
Heap (ํ) ์ ๋ฆฌ (0) | 2021.07.28 |
Hash Table (ํด์ ํ ์ด๋ธ) ์ ๋ฆฌ (0) | 2021.07.23 |
Linked List (๋งํฌ๋ ๋ฆฌ์คํธ) ์ ๋ฆฌ (0) | 2021.07.23 |
Stack (์คํ) ์ ๋ฆฌ (0) | 2021.07.22 |