https://www.acmicpc.net/problem/1991
이진 트리를 입력받아 전위 순회(preorder traversal), 중위 순회(inorder traversal), 후위 순회(postorder traversal)한 결과를 출력하는 프로그램을 작성하시오.
예를 들어 위와 같은 이진 트리가 입력되면,
가 된다.
첫째 줄에는 이진 트리의 노드의 개수 N(1 ≤ N ≤ 26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어진다. 노드의 이름은 A부터 차례대로 알파벳 대문자로 매겨지며, 항상 A가 루트 노드가 된다. 자식 노드가 없는 경우에는 .으로 표현한다.
첫째 줄에 전위 순회, 둘째 줄에 중위 순회, 셋째 줄에 후위 순회한 결과를 출력한다. 각 줄에 N개의 알파벳을 공백 없이 출력하면 된다.
전위 순회(preorder traversal), 중위 순회(inorder traversal), 후위 순회(postorder traversal)의 개념을 이해할 수 있는 트리순회 문제이다. 우선 위의 개념을 먼저 짚고 문제풀이를 하겠다
이러한 개념을 바탕으로 문제를 보면 두번째줄부터 입력되는 값들을 부모노드와 자식노드(left, right)로 구분해주고
tree 라는 딕셔너리에 값들을 넣어주었다. key값이 중복되는 일이 없기에 리스트가아닌 딕셔너리를 사용하였다.
자식노드가 없는칸은 '.'으로 들어오기때문에 return으로 에외처리를 해주었다.
출력은 각 함수마다 재귀로 표현하였고 하나의 정수형이 출력으로 나오기 때문에 for문으로 이어붙이는 방법보다
print(x,end='')이 간결하여 출력부분의 공백만 신경써주어 출력하였다.
n = int(input())
tree = {}
for _ in range(n):
node , left, right = list(input().split())
tree[node] = left, right
def preorder(x):
if x =='.':
return
print(x,end='')
preorder(tree[x][0])
preorder(tree[x][1])
def inorder(x):
if x == '.':
return
inorder(tree[x][0])
print(x,end='')
inorder(tree[x][1])
def postorder(x):
if x == '.':
return
postorder(tree[x][0])
postorder(tree[x][1])
print(x,end='')
preorder('A')
print()
inorder('A')
print()
postorder('A')
[백준_2980] 도로와 신호등_python (0) | 2022.03.29 |
---|---|
[백준_14719] 빗물_python (0) | 2022.03.28 |
[백준_2503] 숫자야구_Py (0) | 2022.03.23 |
[백준_14500] 테트리미노_python (0) | 2022.03.22 |
[백준_15663]N과M(9) (0) | 2022.03.21 |
댓글 영역