# 문제 설명
- 이진트리 - 자식 요소가 두개 이하인 트리
- 전위 순회: 루트 - 왼쪽 - 오른쪽 순서
- 중위 순회: 왼쪽 - 루트 - 오른쪽 순서
- 후위 순회: 왼쪽 - 오른쪽 - 루트 순서
- 문제 풀이에서는 오른쪽 - 루트 - 왼쪽 순서로 순회하는 독특한 방법으로 처리
- 순회하는 동안 배열에 값 추가하고 나중에 노드끼리 값 바인딩
/**
* Definition for a binary tree node.
* public class TreeNode {
* public var val: Int
* public var left: TreeNode?
* public var right: TreeNode?
* public init() { self.val = 0; self.left = nil; self.right = nil; }
* public init(_ val: Int) { self.val = val; self.left = nil; self.right = nil; }
* public init(_ val: Int, _ left: TreeNode?, _ right: TreeNode?) {
* self.val = val
* self.left = left
* self.right = right
* }
* }
*/
class Solution {
private var nodeValues: [Int] = []
// 제일 왼쪽에 있는 값을 리턴해야됨
private func order(_ current: TreeNode?) {
guard let current else { return }
order(current.right)
nodeValues.append(current.val)
order(current.left)
}
private func assignValueOrder(_ current: TreeNode?) {
guard let current else { return }
assignValueOrder(current.right)
current.val = nodeValues.last!
_ = nodeValues.removeLast()
assignValueOrder(current.left)
}
func bstToGst(_ root: TreeNode?) -> TreeNode? {
order(root)
for i in 0..<nodeValues.count - 1 {
nodeValues[i+1] = nodeValues[i+1] + nodeValues[i]
}
nodeValues = nodeValues.reversed()
assignValueOrder(root)
return root
}
}