문제 설명
이진 트리를 입력받아 전위 순회(preorder traversal), 중위 순회(inorder traversal), 후위 순회(postorder traversal)한 결과를 출력하는 프로그램을 작성하시오.
예를 들어 위와 같은 이진 트리가 입력되면,
전위 순회한 결과 : ABDCEFG // (루트) (왼쪽 자식) (오른쪽 자식)
중위 순회한 결과 : DBAECFG // (왼쪽 자식) (루트) (오른쪽 자식)
후위 순회한 결과 : DBEGFCA // (왼쪽 자식) (오른쪽 자식) (루트)
가 된다.
제한 사항
-첫째 줄에는 이진 트리의 노드의 개수 N(1≤N≤26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어진다. 노드의 이름은 A부터 차례대로 영문자 대문자로 매겨지며, 항상 A가 루트 노드가 된다. 자식 노드가 없는 경우에는 .으로 표현된다.
-첫째 줄에 전위 순회, 둘째 줄에 중위 순회, 셋째 줄에 후위 순회한 결과를 출력한다. 각 줄에 N개의 알파벳을 공백 없이 출력하면 된다.
입출력 예
input |
output |
7 A B C B D . C E F E . . F . G D . . G . . |
ABDCEFG DBAECFG DBEGFCA |
접근법
먼저 입력받은 데이터를 트리로 만들어줍니다. 트리는 각 노드를 가지고 있고, 노드는 왼쪽 노드, 오른쪽 노드를 각각 가지고 있습니다. C의 포인터처럼 다른 노드를 하나 지목하고있습니다. 전위 순회 같은 경우에는 루트를 먼저 출력해주고, 왼쪽 순회, 오른쪽 순회를 해주시면 되시고, 중위 같은 경우에는 왼쪽 순회를 먼저 해주시고, 루트 노드를 출력해주시고, 오른쪽 순회를 하시면 됩니다. 후위 순회 같은 경우에는 왼쪽, 오른쪽을 먼저 순회한 뒤, 루트 노드를 출력해 주시면 됩니다.
나의 코드
import sys
number = int(sys.stdin.readline())
sold_book = dict()
for _ in range(number):
book = sys.stdin.readline().replace("\n","")
sold_book[book] = sold_book.get(book,0)+1
sold_book = list(sold_book.items())
sold_book.sort(key = lambda x:(-x[1],x[0]))
print(sold_book[0][0])
'알고리즘 > 백준알고리즘' 카테고리의 다른 글
[백준] 1655번 가운데를 말해요 (0) | 2021.03.31 |
---|---|
[백준] 5397번 키로거 (0) | 2021.03.26 |
[백준] 1302번 베스트셀러 (0) | 2021.03.23 |
[백준] 7453번 합이 0인 네 정수 (0) | 2021.03.23 |
[백준] 1431번 시리얼 번호 (0) | 2021.03.22 |