https://www.acmicpc.net/problem/1991
# 노드
class Node:
def __init__(self, value):
self.value = value
self.left = None
self.right = None
# 노드의 개수
n = int(input())
# 노드 리스트
nodes = [None]*n
for _ in range(n):
current, left, right = input().strip().split()
# current 노드가 처음 등장한 노드라면 새로 생성
if nodes[ord(current) - 65] is None:
node = Node(current)
nodes[ord(current) - 65] = node
# 예전에 어떤 노드의 자식 노드로 등장한 적이 있다면 그 노드 그대로 사용
else:
node = nodes[ord(current)-65]
if left != ".":
if nodes[ord(left)-65] is None:
# 노드 생성
leftNode = Node(left)
# 노드 연결
node.left = leftNode
# 노드 리스트에 추가
nodes[ord(left)-65] = leftNode
# 노드 리스트에 존재지 않았던 value인 경우
else:
node.left = nodes[ord(left)-65]
if right != ".":
if nodes[ord(right)-65] is None:
# 노드 생성
rightNode = Node(right)
# 노드 연결
node.right = rightNode
# 노드 리스트에 추가
nodes[ord(right)-65] = rightNode
# 노드 리스트에 존재지 않았던 value인 경우
else:
node.right = nodes[ord(right)-65]
# 확인용 출력
'''
for n in nodes:
if n is not None:
print("value", n.value, end="")
if n.left is None:
print(" left None", end="")
else:
print(" left", n.left.value, end="")
if n.right is None:
print(" right None", end="")
else:
print(" right", n.right.value, end="")
print()
'''
# 전위 순회 함수
def preorder(node):
print(node.value, end="")
# 왼쪽 자식이 존재하면
if node.left is not None:
preorder(node.left)
# 오른쪽 자식이 존재하면
if node.right is not None:
preorder(node.right)
# 중위 순회 함수
def inorder(node):
# 왼쪽 자식이 존재하면
if node.left is not None:
inorder(node.left)
print(node.value, end="")
# 오른쪽 자식이 존재하면
if node.right is not None:
inorder(node.right)
# 후위 순회 함수
def postorder(node):
# 왼쪽 자식이 존재하면
if node.left is not None:
postorder(node.left)
# 오른쪽 자식이 존재하면
if node.right is not None:
postorder(node.right)
print(node.value, end="")
# 전위 순회
preorder(nodes[0])
print()
# 중위 순회
inorder(nodes[0])
print()
# 후위 순회
postorder(nodes[0])
print()