전위 : 루트 노드 → 왼쪽 자식 → 오른쪽 자식
중위 : 왼쪽 자식 → 루트 노드 → 오른쪽 자식
후위 : 왼쪽 자식 → 오른쪽 자식 → 루트 노드
".")인 경우도 넘겨야 돼→ 따라서 “이 노드를 방문할 필요가 없다면 바로 return”
즉, 너가 쓴 if self.visit[node] == True or ...는
"이 노드를 방문하면 안 되는 이유가 뭐지?" 를 생각하고 있는 거야
이 사고를 일반화하면:
".")사고 패턴 ①:
💭 "이 노드를 처리하지 않아야 할 조건이 뭔가?" → 방어 코드부터 작성하자
사고 패턴 ②:
💭 "이 노드를 방문했다고 간주하면, 어떤 작업을 해야 하지?"
사고 패턴 ③:
💭 "이제 자식 노드로 가려면, 그 자식이 있는지 어떻게 확인하지?"
보통 트리는 self.graph[node] 형태로 [left, right] 를 가지고 있으니까:
left, right = self.graph[node]
self.preorder(left)
self.preorder(right)
A
/ \
B C
preorder('A') 호출했다고 가정하면:"A"는 방문하지 않았고, .도 아님 → OK"A"를 출력 or 처리"A"의 왼쪽 자식 "B"로 재귀 호출"B"도 같은 방식으로 처리"A"의 오른쪽 "C"로 재귀def preorder(self, node):
if node == '.' or self.visit[node]:
return
self.visit[node] = True
print(node, end=' ')
left_ch, right_ch = self.graph[node]
self.preorder(left_ch)
self.preorder(right_ch)
if node == '.' or self.ino_visit[node]:
return
self.ino_visit[node] = True
left_ch, right_ch = self.graph[node]
self.inorder(left_ch)
print(node, end='')
self.inorder(right_ch)
if node == '.' or self.pto_visit[node]:
return
self.pto_visit[node] = True
left_ch, right_ch = self.graph[node]
self.postorder(left_ch)
self.postorder(right_ch)
print(node, end='')