반응형
250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- jdk17
- 오라클
- 코어뱅킹
- 모놀리식
- 맥북셋팅
- 맥북
- oracleapex
- 렌탈스튜디오창업
- 프로그래머스
- 디렉토리계층구조
- Pass By Value
- fastapi
- 컴퓨터공학학사취득
- 코딩테스트
- 의사결정나무모형
- python
- it자격증
- 개인프로필스튜디오창업
- Homebrew
- 계정계
- MSA
- union
- DB
- 맥북환경설정
- 학점은행제무료강의
- 채널계
- jdk
- SQL
- 학점은행제
- 은행IT
Archives
- Today
- Total
개발머해니
[파이썬] 이진 탐색 트리 삭제 구현 (leaf노드 삭제) 본문
728x90
반응형
1. 먼저 search() 메소드를 사용해서 삭제하려는 데이터의 노드를 받아 옵니다.
2. 삭제하려는 노드가 부모 노드의 왼쪽 자식이면부모의 왼쪽 자식을 None으로 바꿔 줍니다
3. 삭제하려는 노드가 부모 노드의 오른쪽 자식이면부모의 오른쪽 자식을 None으로 바꿔 줍니다
class Node:
"""이진 탐색 트리 노드 클래스"""
def __init__(self, data):
self.data = data
self.parent = None
self.right_child = None
self.left_child = None
def print_inorder(node):
"""주어진 노드를 in-order로 출력해주는 함수"""
if node is not None:
print_inorder(node.left_child)
print(node.data)
print_inorder(node.right_child)
class BinarySearchTree:
"""이진 탐색 트리 클래스"""
def __init__(self):
self.root = None
def delete(self, data):
"""이진 탐색 트리 삭제 메소드"""
node_to_delete = self.search(data) # 삭제할 노드를 가지고 온다
parent_node = node_to_delete.parent # 삭제할 노드의 부모 노드
# 지우려는 노드가 root 노드일 때
if parent_node is None:
self.root = None
# 지우려는 노드가 leaf 노드일 때
if node_to_delete == parent_node.left_child:
parent_node.left_child = None
else:
parent_node.right_child = None
@staticmethod
def find_min(node):
"""(부분)이진 탐색 트리의 가장 작은 노드 리턴"""
# 여기에 코드를 작성하세요
temp = node # 탐색용 변수, 파라미터 node로 초기화
# temp가 node를 뿌리로 갖는 부분 트리에서 가장 작은 노드일 때까지 왼쪽 자식 노드로 간다
while temp.left_child is not None:
temp = temp.left_child
return temp
def search(self, data):
"""이진 탐색 트리 탐색 메소드, 찾는 데이터를 갖는 노드가 없으면 None을 리턴한다"""
temp = self.root # 탐색용 변수, root 노드로 초기화
# 원하는 데이터를 갖는 노드를 찾을 때까지 돈다
while temp is not None:
# 원하는 데이터를 갖는 노드를 찾으면 리턴
if data == temp.data:
return temp
# 원하는 데이터가 노드의 데이터보다 크면 오른쪽 자식 노드로 간다
if data > temp.data:
temp = temp.right_child
# 원하는 데이터가 노드의 데이터보다 작으면 왼쪽 자식 노드로 간다
else:
temp = temp.left_child
return None # 원하는 데이터가 트리에 없으면 None 리턴
def insert(self, data):
"""이진 탐색 트리 삽입 메소드"""
new_node = Node(data) # 삽입할 데이터를 갖는 노드 생성
# 트리가 비었으면 새로운 노드를 root 노드로 만든다
if self.root is None:
self.root = new_node
return
# 여기에 코드를 작성하세요
temp = self.root # 저장하려는 위치를 찾기 위해 사용할 변수. root 노드로 초기화한다
# 원하는 위치를 찾아간다
while temp is not None:
if data > temp.data: # 삽입하려는 데이터가 현재 노드 데이터보다 크다면
# 오른쪽 자식이 없으면 새로운 노드를 현재 노드 오른쪽 자식으로 만듦
if temp.right_child is None:
new_node.parent = temp
temp.right_child = new_node
return
# 오른쪽 자식이 있으면 오른쪽 자식으로 간다
else:
temp = temp.right_child
else: # 삽입하려는 데이터가 현재 노드 데이터보다 작다면
# 왼쪽 자식이 없으면 새로운 노드를 현재 노드 왼쪽 자식으로 만듦
if temp.left_child is None:
new_node.parent = temp
temp.left_child = new_node
return
# 왼쪽 자식이 있다면 왼쪽 자식으로 간다
else:
temp = temp.left_child
def print_sorted_tree(self):
"""이진 탐색 트리 내의 데이터를 정렬된 순서로 출력해주는 메소드"""
print_inorder(self.root) # root 노드를 in-order로 출력한다
# 빈 이진 탐색 트리 생성
bst = BinarySearchTree()
# 데이터 삽입
bst.insert(7)
bst.insert(11)
bst.insert(9)
bst.insert(17)
bst.insert(8)
bst.insert(5)
bst.insert(19)
bst.insert(3)
bst.insert(2)
bst.insert(4)
bst.insert(14)
# leaf 노드 삭제
bst.delete(2)
bst.delete(4)
bst.print_sorted_tree()
728x90
반응형
'자료구조' 카테고리의 다른 글
[파이썬] 이진 탐색 트리 삭제 구현 (두 개의 자식이 모두 있는 노드를 삭제하는 경우) (0) | 2023.12.15 |
---|---|
[파이썬] 이진 탐색 트리 삭제 구현 (하나의 자식만 있는 노드를 삭제하는 경우) (0) | 2023.12.15 |
[파이썬] 이진 탐색 트리 find_min() 메소드 구현 (0) | 2023.12.15 |
[파이썬] 이진 탐색 트리 탐색 구현 (0) | 2023.12.15 |
[파이썬] 이진 트리 만들어 보기 (1) | 2023.12.15 |