Algorithm/μ•Œκ³ λ¦¬μ¦˜ 정리

[Algorithm/Python] 이진 탐색 트리 순회 방법(μ „μœ„ / μ€‘μœ„ / ν›„μœ„ 순회)

Chae-riπŸ’ 2024. 9. 3. 17:35

트리

이미지 좜처: α„‹α…΅α„€α…₯α†Ία„‹α…΅ α„Žα…±α„‹α…₯α†Έα„‹α…³α†― 위ᄒᅑᆫ 코당 테스트ᄃᅑ with α„‘α…‘α„‹α…΅α„Šα…₯ᆫ

 

이진 탐색

λ°°μ—΄ λ‚΄λΆ€μ˜ 데이터가 μ •λ ¬λ˜μ–΄ μžˆμ„ λ•Œ μ‚¬μš©ν•  수 μžˆλŠ” μ•Œκ³ λ¦¬μ¦˜.

탐색 λ²”μœ„λ₯Ό μ ˆλ°˜μ”© μ’ν˜€κ°€λ©° 데이터λ₯Ό νƒμƒ‰ν•˜λŠ” νŠΉμ§•μ΄ μžˆλ‹€.

 

이진 탐색을 ν• λ•ŒλŠ” μ‹œμž‘μ , 끝점, 쀑간점 3개의 λ³€μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€.

# μ΄μ§„νƒμƒ‰μ†ŒμŠ€μ½”λ“œ κ΅¬ν˜„(μž¬κ·€ν•¨μˆ˜)
def binary_search(array, target, start, end):
	if start > end:
    	return None
	mid = (start + end) // 2
	# 찾은 경우 쀑간점 인덱슀 λ°˜ν™˜
	if array[mid] == target:
    	return mid
	# μ€‘κ°„μ μ˜ 값보닀 찾고자 ν•˜λŠ” 값이 μž‘μ€ 경우 μ™Όμͺ½ 확인
    elif array[mid] > target:
		return binary_search(array, target, start, mid - 1)
    # μ€‘κ°„μ μ˜ 값보닀 찾고자 ν•˜λŠ” 값이 큰 경우 였λ₯Έμͺ½ 확인
	else:
		return binary_search(array, target, mid + 1, end)

# n(μ›μ†Œμ˜ 개수)κ³Ό target(찾고자 ν•˜λŠ” λ¬Έμžμ—΄)을 μž…λ ₯ λ°›κΈ°
n, target = list(map(int,input().split()))
# 전체 μ›μ†Œ μž…λ ₯ λ°›κΈ°
array = list(map(int, input().split()))

# 이진 탕색 μˆ˜ν–‰ κ²°κ³Ό 좜λ ₯
result = binary_search(array, target, 0, n - 1)
if result == None:
	print ("μ›μ†Œκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.")
else:
	print(result + 1)

 

이진 탐색을 ν•œ 번 ν•  λ•Œλ§ˆλ‹€ ν™•μΈν•˜λŠ” μ›μ†Œμ˜ κ°œμˆ˜κ°€ μ ˆλ°˜μ”© 쀄어든닀.

->  μ‹œκ°„ λ³΅μž‘λ„ O(logN)

 

이진 탐색 트리

이미지 좜처: α„‹α…΅α„€α…₯α†Ία„‹α…΅ α„Žα…±α„‹α…₯α†Έα„‹α…³α†― 위ᄒᅑᆫ 코당 테스트ᄃᅑ with α„‘α…‘α„‹α…΅α„Šα…₯ᆫ

 

μ™Όμͺ½ μžμ‹ λ…Έλ“œ < λΆ€λͺ¨ λ…Έλ“œ < 였λ₯Έμͺ½ μžμ‹ λ…Έλ“œ κ°€ 성립해야 함

 

μ „μœ„ 순회

루트 -> μ™Όμͺ½ -> 였λ₯Έμͺ½

def preorder(self):
    def preorder(root):
        if root is None:
            pass
        else:
            print(root.data)
            preorder(root.left)
            preorder(root.right)
    preorder(self.root)

μ€‘μœ„ 순회

μ™Όμͺ½ -> 루트 -> 였λ₯Έμͺ½

def inorder(self):
    def inorder(root):
        if root is None:
            pass
        else:
            inorder(root.left)
            print(root.data)
            inorder(root.right)
    inorder(self.root)

ν›„μœ„ 순회

μ™Όμͺ½ -> 였λ₯Έμͺ½ -> 루트

def postorder(self):
    def postorder(root):
        if root is None:
            pass
        else:
            postorder(root.left)
            postorder(root.right)
            print(root.data)
    postorder(self.root)

 

 

728x90