Post

백준 5639번 python 풀이 - 이진 검색 트리

문제 링크

5639번

해결책

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import sys
sys.setrecursionlimit(10**6)

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


class BinarySearchTree:
    def __init__(self):
        self.root = None

    def insert_by_val(self, nodeVal):
        node = Node(nodeVal)

        if self.root is None:
            self.root = node
            return

        cur = self.root

        while True:
            if cur.val < nodeVal:
                if cur.right is None:
                    cur.right = node
                    return
                cur = cur.right
            elif cur.val > nodeVal:
                if cur.left is None:
                    cur.left = node
                    return
                cur = cur.left

    def insert_by_parent(self, nodeVal, way=None, parent_val: Node = None):
        node = Node(nodeVal)

        if self.root is None:
            self.root = node
            return

        if parent_val is not None:
            stack = [self.root]
            while stack:
                cur: Node = stack.pop()
                if cur.val == parent_val:
                    if way == "L":
                        cur.left = node
                        return
                    elif way == "R":
                        cur.right = node
                        return
                else:
                    if cur.right is not None:
                        stack.append(cur.right)
                    if cur.left is not None:
                        stack.append(cur.left)
            return 0

    def preorder_traversal_recursion(self, node: Node = None):
        if self.root is None:
            return

        if node is None:
            cur = self.root
        else:
            cur = node

        print(cur.val, end="")
        if cur.left is not None:
            self.preorder_traversal_recursion(cur.left)
        if cur.right is not None:
            self.preorder_traversal_recursion(cur.right)
        return

    def inorder_traversal_recursion(self, node: Node = None):
        if self.root is None:
            return

        if node is None:
            cur = self.root
        else:
            cur = node

        if cur.left is not None:
            self.inorder_traversal_recursion(cur.left)
        print(cur.val, end="")
        if cur.right is not None:
            self.inorder_traversal_recursion(cur.right)
        return

    def postorder_traversal_recursion(self, node: Node = None):
        if self.root is None:
            return

        if node is None:
            cur = self.root
        else:
            cur = node

        if cur.left is not None:
            self.postorder_traversal_recursion(cur.left)
        if cur.right is not None:
            self.postorder_traversal_recursion(cur.right)
        print(cur.val)
        return


bst = BinarySearchTree()
num_list = []

# 이런 입력은 백준에서만 가능할 것이다.
while True:
    try:
        num = int(input())
        num_list.append(num)
    except:
        break

for i in num_list:
    bst.insert_by_val(i)

bst.postorder_traversal_recursion()

주석으로 달 설명

역시나 이진탐색 트리의 문제이다.

조건에서 inorder를 주고, 이를 기반으로 postorder를 출력하는 문제인데, 왠지 트리를 이번에도 구현하는 연습이 하고 싶어, 구현을 기준으로 문제를 해결해보았다. 이전 문제인 5639에서 구현 방식에 대해 조금 더 다루었으며, 트리에서 역시 다루었기에, 자세한 설명은 뒤로하고 넘어가기로 하자.

This post is licensed under CC BY 4.0 by the author.