💯Problem Solving

[BOJ] 5639 이진 검색 트리

date
Jul 17, 2023
slug
boj-5639
author
status
Public
tags
Python
BOJ
summary
백준 5639번 문제풀이입니다.
type
Post
thumbnail
category
💯Problem Solving
updatedAt
Jul 16, 2023 04:20 PM

문제 링크


문제


이진 검색 트리는 다음과 같은 세 가지 조건을 만족하는 이진 트리이다.
  • 노드의 왼쪽 서브트리에 있는 모든 노드의 키는 노드의 키보다 작다.
  • 노드의 오른쪽 서브트리에 있는 모든 노드의 키는 노드의 키보다 크다.
  • 왼쪽, 오른쪽 서브트리도 이진 검색 트리이다.
notion image
전위 순회 (루트-왼쪽-오른쪽)은 루트를 방문하고, 왼쪽 서브트리, 오른쪽 서브 트리를 순서대로 방문하면서 노드의 키를 출력한다. 후위 순회 (왼쪽-오른쪽-루트)는 왼쪽 서브트리, 오른쪽 서브트리, 루트 노드 순서대로 키를 출력한다. 예를 들어, 위의 이진 검색 트리의 전위 순회 결과는 50 30 24 5 28 45 98 52 60 이고, 후위 순회 결과는 5 28 24 45 30 60 52 98 50 이다.
이진 검색 트리를 전위 순회한 결과가 주어졌을 때, 이 트리를 후위 순회한 결과를 구하는 프로그램을 작성하시오.

문제풀이


전위순회 결과를 입력받아, 이진검색트리를 구성후
후위순회 코드를 작성하여 재귀로 풀었다.
python3로는 재귀 정답이 맞지 않는것 같다
pypy3로 해서 풀었다.
 
set.recursionlimit(10**6)으로 하니까 메모리 초과가나서
10**5로 바꿔주니 정답처리 됬다.
 
파이썬 문제풀이 코드
import sys input = sys.stdin.readline sys.setrecursionlimit(10 ** 5) class Tree: def __init__(self): self.root = None class Node: def __init__(self, value): self.value = value self.left = None self.right = None def bst(new_node, node): if new_node.value < node.value: if node.left is not None: bst(new_node, node.left) else: node.left = new_node else: if node.right is not None: bst(new_node, node.right) else: node.right = new_node def post_order(node): if node is None: return post_order(node.left) post_order(node.right) print(node.value) return tree = Tree() li = [] while True: try: node = Node(int(input())) if not tree.root: tree.root = node else: li.append(node) except: root = tree.root for i in li: bst(i, root) post_order(root) break
 
시간복잡도
  • O(nlogn)

입력


트리를 전위 순회한 결과가 주어진다. 노드에 들어있는 키의 값은 106보다 작은 양의 정수이다. 모든 값은 한 줄에 하나씩 주어지며, 노드의 수는 10,000개 이하이다. 같은 키를 가지는 노드는 없다.

출력


입력으로 주어진 이진 검색 트리를 후위 순회한 결과를 한 줄에 하나씩 출력한다.

예제 입력


50 30 24 5 28 45 98 52 60

예제 출력


5 28 24 45 30 60 52 98 50

알고리즘 분류


  • 구현
  • 문자열