[Python] Binary Search Tree

Updated:

Python Binary Search Tree

[LeetCode] Sum of Nodes with Even-Valued Grandparent

문제λ₯Ό ν’€λ©° ꢁ금증이 생겨 파이썬으둜 이진 탐색 트리λ₯Ό λ§Œλ“€μ–΄ 보렀고 ν•œλ‹€.

C 둜 κ΅¬ν˜„ν•˜λ €λ©΄ 포인터λ₯Ό μ¨μ•Όν•΄μ„œ ꡉμž₯히 λ³΅μž‘ν•œλ° νŒŒμ΄μ¬μ€ μ–΄λ–¨κΉŒ ?

κ·Έ 전에 μ΄μ§„νŠΈλ¦¬μ™€ μ΄μ§„νƒμƒ‰νŠΈλ¦¬λ₯Ό 비ꡐ ν•΄ 보자. 이진 νŠΈλ¦¬λŠ” λͺ¨λ“  λ…Έλ“œμ˜ μžμ‹μ΄ 2개 μ΄ν•˜μ΄λ©΄ λœλ‹€.

ν•˜μ§€λ§Œ 이진 탐색 νŠΈλ¦¬λŠ” μ—¬κΈ°μ„œ 쑰건이 더 μΆ”κ°€ λ˜λŠ”λ° ν˜„μž¬ λ…Έλ“œλ₯Ό κΈ°μ€€μœΌλ‘œ μ™Όμͺ½ μžμ‹μ€ 값이 μž‘μ•„μ•Ό ν•˜κ³  였λ₯Έμͺ½ μžμ‹μ€ 값이 컀야 ν•œλ‹€.

또 λͺ¨λ“  λ…Έλ“œλŠ” 유일 ν•œ 값을 가진닀. 이런 쑰건을 κ°€μ§€λŠ” μ΄μœ λŠ” λ‚΄κ°€ μ›ν•˜λŠ” 값을 μ°Ύμ•„κ°ˆλ•Œ λΉ λ₯΄κ²Œ μ°Ύμ•„ 갈 수 있기 λ•Œλ¬Έμ΄λ‹€.


data = [9, 7, 15, 10, 3, 8, 2, 17, 13, 25, 4] λ₯Ό 이진 탐색 트리둜 λ§Œλ“€μ–΄ 보렀고 ν•œλ‹€. λ¨Όμ € λ…Έλ“œλ₯Ό λ§Œλ“€μ–΄ μ£Όμ–΄μ•Ό ν•œλ‹€.

λ…Έλ“œλŠ” 값을 가지고 μžˆλŠ” ν•œ λ©μ–΄λ¦¬λ‘œ μƒκ°ν•˜λ©΄ λœλ‹€.

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

C 둜 할땐 각 λ…Έλ“œλ₯Ό ν¬μΈν„°λ‘œ μ—°κ²° ν•΄ μ£Όμ–΄μ•Ό ν–ˆλŠ”λ° 객체둜 λ§Œλ“œλ‹ˆ λŒ€μž…λ§Œ ν•΄μ£Όλ©΄ λ˜μ–΄μ„œ μ•„μ£Ό νŽΈν–ˆλ‹€..

λ…Έλ“œλ₯Ό λ§Œλ“€μ—ˆλ‹€λ©΄ μš°λ¦¬κ°€ λ§Œλ“€κ³ μž ν•˜λŠ” 이진 탐색 트리 객체λ₯Ό λ§Œλ“ λ‹€.

class Binary_Search_Tree:
	def __init__(self):
		self.root = None
    
    
my_tree = Binary_Search_Tree()

이 μƒνƒœλŠ” λ…Έλ“œκ°€ μ•„μ˜ˆ μ—†λŠ” 빈 트리λ₯Ό ν•œ 개 λ§Œλ“  μƒνƒœμ΄λ‹€.

Insert

insert ν•¨μˆ˜λ₯Ό λ§Œλ“€μ–΄ 값을 가진 λ…Έλ“œλ₯Ό 트리둜 λ§Œλ“€μ–΄ μ€€λ‹€.

class Binary_Search_Tree:

	def insert(self, data):
		self.root = self.insert_node(self.root, data)
		return self.root

	def insert_node(self, node, data):
		if node is None:
			node = Node(data)  # 루트 λ…Έλ“œ 생성
		else:
			if data < node.data:
				node.left = self.insert_node(node.left, data)
			else:
				node.right = self.insert_node(node.right, data)
		return node

Find

이진 탐색 νŠΈλ¦¬μ— λ‚΄κ°€ μ›ν•˜λŠ” 값이 μžˆλŠ”μ§€ ꢁ금 ν•œ κ²½μš°κ°€ μžˆλ‹€. μ΄λ•Œ 이진 탐색 트리의 νŠΉμ§•μ„ 톡해 λΉ λ₯΄κ²Œ 값을 찾을 수 μžˆλ‹€.

class Binary_Search_Tree:

	def find(self, key):
		return self._find(self.root, key)

	def _find(self, root, key):
		if root is None or key == root.data:
			return root is not None
		else:
			if key < root.data:
				return self._find(root.left, key)
			else:
				return self._find(root.right, key)

μž¬κ·€ν•¨μˆ˜λ₯Ό 톡해 λ‚˜λ³΄λ‹€ μž‘μœΌλ©΄ μ™Όμͺ½, λ‚˜λ³΄λ‹€ 크면 였λ₯Έμͺ½μœΌλ‘œ κ°€ 탐색을 ν•œλ‹€.

Pre-Order (μ „μœ„ 순회)

루트 β†’Β μ™Όμͺ½ μ„œλΈŒνŠΈλ¦¬ β†’Β μ˜€λ₯Έμͺ½ μ„œλΈŒνŠΈλ¦¬ μˆœμ„œλ‘œ 순회 ν•˜λŠ” 방식이닀.

class Binary_Search_Tree:

	def pre_order(self):
		output = []

		def _pre_order(node):
			if node is None:
				return
			else:
				output.append(node.data)
				_pre_order(node.left)
				_pre_order(node.right)
		_pre_order(self.root)
		print('Pre_Order :', output)

data = [9, 7, 15, 10, 3, 8, 2, 17, 13, 25, 4] 이 λ°°μ—΄λ‘œ 이진 탐색 트리λ₯Ό λ§Œλ“  λ’€ μ „μœ„ 순회λ₯Ό ν•˜λ©΄

[9, 7, 3, 2, 4, 8, 15, 10, 13, 17 ,25] μˆœμ„œλ‘œ 순회 ν•œλ‹€.

In-Order (μ€‘μœ„ 순회)

μ™Όμͺ½ μ„œλΈŒνŠΈλ¦¬ β†’ 루트 β†’ 였λ₯Έμͺ½ μ„œλΈŒνŠΈλ¦¬ μˆœμ„œλ‘œ 순회 ν•˜λŠ” 방식이닀.

class Binary_Search_Tree:

	def in_order(self):
		output = []

		def _in_order(node):
			if node is None:
				return
			else:
				_in_order(node.left)
				output.append(node.data)
				_in_order(node.right)
		_in_order(self.root)
		print('In_Order :', output)

data = [9, 7, 15, 10, 3, 8, 2, 17, 13, 25, 4] 이 λ°°μ—΄λ‘œ 이진 탐색 트리λ₯Ό λ§Œλ“  λ’€ μ€‘μœ„ 순회λ₯Ό ν•˜λ©΄

[2, 3, 4, 7, 8, 9, 10, 13, 15, 17, 25] μˆœμ„œλ‘œ 순회 ν•œλ‹€. μ •λ ¬ 된 값을 얻을 수 μžˆλ‹€λŠ” νŠΉμ§•μ΄ μžˆλ‹€.

Post-Order (ν›„μœ„ 순회)

μ™Όμͺ½ μ„œλΈŒνŠΈλ¦¬ β†’ 였λ₯Έμͺ½ μ„œλΈŒνŠΈλ¦¬β†’ 루트 μˆœμ„œλ‘œ 순회 ν•˜λŠ” 방식이닀.

class Binary_Search_Tree:

	def post_order(self):
		output = []

		def _post_order(node):
			if node is None:
				return
			else:
				_post_order(node.left)
				_post_order(node.right)
				output.append(node.data)
		_post_order(self.root)
		print('Post_Order :', output)

data = [9, 7, 15, 10, 3, 8, 2, 17, 13, 25, 4] 이 λ°°μ—΄λ‘œ 이진 탐색 트리λ₯Ό λ§Œλ“  λ’€ ν›„μœ„ 순회λ₯Ό ν•˜λ©΄

[2, 4, 3, 8, 7, 13, 10, 25, 17, 15, 9] μˆœμ„œλ‘œ 순회 ν•œλ‹€. μ •λ ¬ 된 값을 얻을 수 μžˆλ‹€λŠ” νŠΉμ§•μ΄ μžˆλ‹€.

Level-Order (레벨 순회)

레벨 순으둜 λ…Έλ“œλ“€μ„ 순회 ν•œλ‹€.

class Binary_Search_Tree:

	def level_order(self):
		output = []
		def _level_order(root):
			queue = deque()
			queue.append(root)

			while queue:
				node = queue.popleft()
				if node is not None:
					output.append(node.data)
					if node.left:
						queue.append(node.left)
					if node.right:
						queue.append(node.right)
		_level_order(self.root)
		print('level_order :', output)

data = [9, 7, 15, 10, 3, 8, 2, 17, 13, 25, 4] 이 λ°°μ—΄λ‘œ 이진 탐색 트리λ₯Ό λ§Œλ“  λ’€ 레벨 순회λ₯Ό ν•˜λ©΄

[9, 7, 15, 3, 8, 10, 17, 2, 4, 13, 25] μˆœμ„œλ‘œ 순회 ν•œλ‹€. κ·Έλž˜ν”„μ™€ 달리 연결이 λ˜μ–΄μžˆμ§€ μ•ŠκΈ° λ•Œλ¬Έμ— λ°©λ¬Έ μ—¬λΆ€λ₯Ό μ²΄ν¬ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.

πŸ“• μ°Έμ‘°, 좜처


Categories:

Updated:

Leave a comment