GitHub

https://github.com/Choidongjun0830

파이썬 알고리즘 문제 풀이

Baekjoon Online Judge 1991번 파이썬

gogi masidda 2022. 8. 31. 17:25

문제 링크
https://www.acmicpc.net/problem/1991

1991번: 트리 순회

첫째 줄에는 이진 트리의 노드의 개수 N(1 ≤ N ≤ 26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어진다. 노드의 이름은 A부터 차례대로 알파

www.acmicpc.net


__init__ : 생성자라고 불리는 초기화를 위한 함수.
인스턴스화를 할 때 반드시 처음 호출되는 함수.
오브젝트 생성(인스턴스 생성)과 관련하여 데어터의 초기화를 실시하는 함수.
__init__은 반드시 첫번째 인수로 self를 지정해야함.
클래스 생성할 때에 지정된인수는 초기화 메소드의 2번째 부터 작성.

전위 순회, 중위 순회, 후위 순회를 하는 코드를 작성할 때, 각각의 방법을 어떻게 코드로 작성할 지 생각하기 어려웠다.

정답 코드

import sys
  
class Tree:
  def __init__ (self, root, left, right):
    self.root = root
    self.left = left
    self.right = right

#전위 순회: 뿌리 - 왼쪽 - 오른쪽 순으로 방문하기 때문에, 노드를 방문하고 왼쪽 전위 순회, 오른쪽 전위 순회를 실행한다.
def preorder(node):
  print(node.root, end='')
  if node.left != '.': #node의 왼쪽 자식이 있을 때
    preorder(tree[node.left])
  if node.right != '.': #node의 오른쪽 자식이 있을 때
    preorder(tree[node.right])

#중위 순회: 왼쪽 - 뿌리 - 오른쪽 순으로 방문하기 때문에, 왼쪽 중위 순회를 한 후에 노드를 방문한다. 그 후에 오른쪽 중위 순회를 실행한다.
def inorder(node):
  if node.left != '.':
    inorder(tree[node.left])
  print(node.root, end='')
  if node.right != '.':
    inorder(tree[node.right])

#후위 순회: 왼쪽 - 오른쪽 - 뿌리 순으로 방문하기 때문에, 왼쪽 후위 순회, 오른쪽 후위 순회를 실행하고, 그 후에 노드를 방문한다.
def postorder(node):
  if node.left != '.':
    postorder(tree[node.left])
  if node.right != '.':
    postorder(tree[node.right])
  print(node.root, end='')

N = int(sys.stdin.readline().rstrip())
inputs = []
for i in range(N):
    inputs.append(sys.stdin.readline().split())  

tree = {}
for root, left, right in inputs:
  tree[root] = Tree(root,left,right)
preorder(tree['A'])
print()
inorder(tree['A'])
print()
postorder(tree['A'])
728x90