티스토리 뷰
배열에 트리를 저장하여 전위순회 / 중위순회 / 후위순회를 행한다.
입력으로 문자가 들어오는데 배열의 인덱스로 요소에 접근하려면 0이 아닌 정수 형태로 바꿔주는게 좋겠다.
저장은 정수로 하고 출력할 때 다시 처리해주는 게 좋다.
모든 순회의 경우 재귀호출로 구현할 수 있는데, 루트 노드를 출력하는 줄만 다르게 작성해주고 자식 노드를 순회하는 코드를 작성해주면 된다.
Swift는 문자를 정수로 바꾸고 정수를 문자로 바꾸는 작업이 쉽지 않다...
let A = Int(("A".unicodeScalars.first?.value)!)
func preorder(array: [[Int]], start: Int) {
if start == -1 {
return
}
print(UnicodeScalar(start + A)!, terminator: "")
preorder(array: array, start: array[start][0])
preorder(array: array, start: array[start][1])
}
func inorder(array: [[Int]], start: Int) {
if start == -1 {
return
}
inorder(array: array, start: array[start][0])
print(UnicodeScalar(start + A)!, terminator: "")
inorder(array: array, start: array[start][1])
}
func postorder(array: [[Int]], start: Int) {
if start == -1 {
return
}
postorder(array: array, start: array[start][0])
postorder(array: array, start: array[start][1])
print(UnicodeScalar(start + A)!, terminator: "")
}
let count = Int(readLine()!)!
var array = [[Int]].init(repeating: [0, 0], count: count)
for _ in 0..<count {
let input = readLine()!.split(separator: " ")
let x = Int((input[0].unicodeScalars.first?.value)!) - A
let y = input[1].description
let z = input[2].description
if y == "." {
array[x][0] = -1
} else {
array[x][0] = Int((y.unicodeScalars.first?.value)!) - A
}
if z == "." {
array[x][1] = -1
} else {
array[x][1] = Int((z.unicodeScalars.first?.value)!) - A
}
}
preorder(array: array, start: 0)
print()
inorder(array: array, start: 0)
print()
postorder(array: array, start: 0)
print()
'Algorithm > Baekjoon Online Judge' 카테고리의 다른 글
4948번 '베르트랑 공준' (0) | 2018.08.13 |
---|---|
11725번 '트리의 부모 찾기' (0) | 2018.08.11 |
2902번 'KMP는 왜 KMP일까?' (0) | 2018.08.10 |
10451번 '순열 사이클' (0) | 2018.08.10 |
3036번 '링' (0) | 2018.08.10 |