일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- BFS알고리즘
- 백준알고리즘2920번
- 최단거리알고리즘
- 코딩테스트인강
- package-install
- nqueen
- 인강
- 시나공정보처리기사
- 코딩테스트
- 알고리즘
- 파이썬
- 작심삼개월
- 시간복잡도
- FastCampus
- 내돈내산
- 환급챌린지
- Korean-NLP
- 연결리스트
- 패스트캠퍼스
- 코딩테스트대비
- 크루스칼알고리즘
- 자료구조
- 프림알고리즘
- 1주차완료
- DFS알고리즘
- Ai
- 퀵정렬
- 해쉬테이블
- 트리구조
- AIFFEL
- Today
- Total
DevLog
[패스트캠퍼스 :: 코딩테스트 인강] 4주차 ② 트리 / 이진 트리 본문
알고리즘/기술면접 완전 정복 올인원 패키지 Online
자료구조(트리) - 트리(Tree) - 5
자료구조(트리) - 트리(Tree) - 6
자료구조(트리) - 트리(Tree) - 7
자료구조(트리) - 트리(Tree) - 8
자료구조의 끝은 어딜까
강의 한 달 만에 또 현타가 심하게 와버림...
Case3-1: 삭제할 Node가 Child Node를 두 개 가지고 있을 경우 (삭제할 Node가 Parent Node 왼쪽에 있을 때)
-
기본 사용 가능 전략
-
삭제할 Node의 오른쪽 자식 중, 가장 작은 값을 삭제할 Node의 Parent Node가 가리키도록 한다.
-
삭제할 Node의 왼쪽 자식 중, 가장 큰 값을 삭제할 Node의 Parent Node가 가리키도록 한다.
-
-
기본 사용 가능 전략 중, 1번 전략을 사용하여 코드를 구현하기로 함
-
경우의 수가 또다시 두 가지가 있음
-
Case3-1-1: 삭제할 Node가 Parent Node의 왼쪽에 있고, 삭제할 Node의 오른쪽 자식 중, 가장 작은 값을 가진 Node의 Child Node가 없을 때
-
Case3-1-2: 삭제할 Node가 Parent Node의 왼쪽에 있고, 삭제할 Node의 오른쪽 자식 중, 가장 작은 값을 가진 Node의 오른쪽에 Child Node가 있을 때
-
가장 작은 값을 가진 Node의 Child Node가 왼쪽에 있을 경우는 없음, 왜냐하면 왼쪽 Node가 있다는 것은 해당 Node보다 더 작은 값을 가진 Node가 있다는 뜻이기 때문임
-
-
-
if self.current_node.left != None and self.current_node.right != None: # case3
if value < self.parent.value: # case3-1
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
Case3-2: 삭제할 Node가 Child Node를 두 개 가지고 있을 경우 (삭제할 Node가 Parent Node 오른쪽에 있을 때)
-
기본 사용 가능 전략
-
삭제할 Node의 오른쪽 자식 중, 가장 작은 값을 삭제할 Node의 Parent Node가 가리키도록 한다.
-
삭제할 Node의 왼쪽 자식 중, 가장 큰 값을 삭제할 Node의 Parent Node가 가리키도록 한다.
-
-
기본 사용 가능 전략 중, 1번 전략을 사용하여 코드를 구현하기로 함
-
경우의 수가 또다시 두가지가 있음
-
Case3-2-1: 삭제할 Node가 Parent Node의 오른쪽에 있고, 삭제할 Node의 오른쪽 자식 중, 가장 작은 값을 가진 Node의 Child Node가 없을 때
-
Case3-2-2: 삭제할 Node가 Parent Node의 오른쪽에 있고, 삭제할 Node의 오른쪽 자식 중, 가장 작은 값을 가진 Node의 오른쪽에 Child Node가 있을 때
-
가장 작은 값을 가진 Node의 Child Node가 왼쪽에 있을 경우는 없음, 왜냐하면 왼쪽 Node가 있다는 것은 해당 Node보다 더 작은 값을 가진 Node가 있다는 뜻이기 때문임
-
-
-
class Node:
def __init__(self, value):
self.value = value
self.left = None
self.right = None
class NodeMgmt:
def __init__(self, head):
self.head = head
def insert(self, value):
self.current_node = self.head
while True:
if value < self.current_node.value:
if self.current_node.left != None:
self.current_node = self.current_node.left
else:
self.current_node.left = Node(value)
break
else:
if self.current_node.right != None:
self.current_node = self.current_node.right
else:
self.current_node.right = Node(value)
break
def search(self, value):
self.current_node = self.head
while self.current_node:
if self.current_node.value == value:
return True
elif value < self.current_node.value:
self.current_node = self.current_node.left
else:
self.current_node = self.current_node.right
return False
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
<전체 이진 트리 검색 기능 구현>
이번 주도 나의 마음을 너무 잘 알아주신
온라인 강사님이지만
너무 마음의 위안(?)을 얻는 강사님과
트리 구조를 알아보았다.
근데 다음이 두려운 건 여전하다.
[패스트캠퍼스 100% 환급 챌린지 미션 중입니다.]
'IT 개발 > Algorithm 알고리즘' 카테고리의 다른 글
[패스트캠퍼스 :: 코딩테스트 인강] 5주차 ② 정렬 / 버블 정렬 (0) | 2021.03.21 |
---|---|
[패스트캠퍼스 :: 코딩테스트 인강] 5주차 ① 힙 (Heap) (0) | 2021.03.19 |
[패스트캠퍼스 :: 코딩테스트 인강] 4주차 ① 트리 / 이진 트리 (0) | 2021.03.13 |
[패스트캠퍼스 :: 코딩테스트 인강] 3주차 ② 해쉬 테이블 + 기초 문제풀이 (0) | 2021.03.05 |
[패스트캠퍼스 :: 코딩테스트 인강] 3주차 ① 해쉬 테이블 (0) | 2021.03.03 |