bong-u/til

백준 - 5639 : 이진 검색 트리 (G5)

수정일 : 2024-11-15

풀이방법 1 : 직접 구현

 1import sys
 2
 3sys.setrecursionlimit(10**6)
 4class Node:
 5    def __init__(self, value):
 6        self.value = value
 7        self.left = None
 8        self.right = None
 9
10class BinaryTree:
11    def __init__(self, root):
12        self.root = root
13
14    def insert(self, value):
15        cur_node = self.root
16        while True:
17            if value < cur_node.value:
18                if cur_node.left != None:
19                    cur_node =  cur_node.left
20                else:
21                    cur_node.left = Node(value)
22                    break
23            else:
24                if cur_node.right != None:
25                    cur_node = cur_node.right
26                else:
27                    cur_node.right = Node(value)
28                    break
29
30    def traverse(self, node):
31        if node.left != None:
32            self.traverse(node.left)
33        if node.right != None:
34            self.traverse(node.right)
35        print (node.value)
36try:
37    tree = BinaryTree(Node(int(input())))
38except:
39    exit()
40
41while True:
42    try:
43        tree.insert(int(input()))
44    except:
45        break
46
47tree.traverse(tree.root)
  • 직접 트리를 구현하여 해결하였다

풀이방법 2

 1import sys
 2sys.setrecursionlimit(10**6)
 3
 4L = []
 5while True:
 6    try:
 7        L.append(int(input()))
 8    except:
 9        break
10
11def traverse(root, end):
12    if root > end:
13        return
14    mid = end + 1
15
16    for i in range(root+1, end+1):
17        if L[root] < L[i]:
18            mid = i
19            break
20
21    traverse(root+1, mid-1)
22    traverse(mid, end)
23    print (L[root])
24
25traverse(0, len(L)-1)
  • 트리를 구현하지 않고 푸는 풀이는 인터넷을 참고하였다
  • 전위 순회한 결과를 리스트에 저장한 후, root 기준으로 나눠지는 mid를 찾아
  • root기준 왼쪽, root기준 오른쪽을 각각 재귀적으로 순회하는 방법이다.