문제 : https://leetcode.com/problems/sum-root-to-leaf-numbers/submissions/
Sum Root to Leaf Numbers - LeetCode
Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.
leetcode.com
시도했던 방법
- 처음에 레벨순회(BFS)로 TreeNode를 배열로 바꾼후 부모노드인덱스 = 자식노드인덱스/2 를 이용하려고 함
- 부모노드인덱스 = 자식노드인덱스/2의 특징은 완전이진트리에서만 쓸 수 있었다.
- 이 문제는 그냥 이진트리이다. 이것을 완전이진트리로 바꾸려면 결국 깊이우선탐색을해서 제일 깊은 레벨이 몇인지 알아내야만 한다.
- 너무 빙빙 돌아가는 거 같아서 결국 다른 방법을 생각해 내야 했다.
풀이방법 (BFS)
- queue를 이용하여 레벨 순회 하였다.
- 레벨이 올라갈 때마다 10 * 전 과정의 부모노드 값들의 합 + 현재노드의 값 을 따로 변수에 저장해준다.
- queue가 빌 때 까지 반복하는데 만약 왼쪽, 오른쪽 노드가 둘다 nil인 노드를 만나면 여태까지 따로 변수에 저장했던 2번의 결과값을 리턴한다
코드
import Foundation
//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 {
//오른쪽 노드부터 돌려면 스택, 왼쪽부터면 큐
func sumNumbers(_ root: TreeNode?) -> Int {
guard let root = root else {
return 0
}
var queue = [(TreeNode, Int)]()
queue.append((root, 0))
var result = 0
while !queue.isEmpty {
let (node, val) = queue.removeFirst()
let sum = 10 * val + node.val
if node.left == nil && node.right == nil {
result += sum
}
if node.left != nil {
queue.append((node.left!, sum))
}
if node.right != nil {
queue.append((node.right!, sum))
}
}
return result
}
}
var sol = Solution()
//print(sol.sumNumbers(TreeNode(1, TreeNode(2), TreeNode(3))))
print(sol.sumNumbers(TreeNode(4, TreeNode(9, TreeNode(5), TreeNode(1)), TreeNode(0))))
//print(sol.sumNumbers(TreeNode(2, TreeNode(1, TreeNode(4, TreeNode(7, TreeNode(4, TreeNode (8), nil), nil), nil), nil), nil)))
깨달은점
root node가 1 이고 왼쪽 노드가 2 오른쪽노드가 3인 이진트리를
queue로 하면 레벨순회(1,2,3)가 되고 stack으로 하면 (1,3,2) 오른쪽부터 탐색한다.
DFS로 하려면 재귀함수로 돌려야할 듯
DFS: https://velog.io/@sett_park/Sum-Root-to-Leaf-Numbers
Sum Root to Leaf Numbers
문제 https://leetcode.com/problems/sum-root-to-leaf-numbers/ 문제 접근 DFS 여서 인접 행렬로 만들고 하나의 큐와 하나의 스택으로 풀어야 겠다 input = [1,2,3,4,5]이 이렇게 생겨서 주어진 배열을 인접 행렬로 만
velog.io
2021.07.22 추가 (예시: 루트노드가 1인 포화이진트리)
- 스택으로하면 DFS - (1,3,7,6,2,5,4) 깊이있게 먼저 탐색
- 큐로하면 BFS - (1,2,3,4,5,6,7) 레벨별로 먼저 탐색
스택 코드
class Solution {
func sumNumbers(_ root: TreeNode?) -> Int {
// Input TreeNode를 바인딩한 후 stack에 튜플 형태로 담는다. 값을 계산하는 result는 초기값 0
guard let root = root else { return 0 }
var stack = [(root, 0)]
var result = 0
// Input TreeNode가 빈 배열이 될때까지 반복문을 돈다
while !stack.isEmpty {
let (node, val) = stack.popLast()!
//sumVar = curVal * 자릿수 증가를 위한 10 + 현재 Node의 값
let sumVal = val * 10 + node.val
print(node.val, "Stack")
// Node가 마지막일 경우, result 값에 계산한 val를 더해준다.
// 마지막이 아닐 경우는 각각 다음 Node와 계산한 val를 stack에 넣어준다.(좌우 동시에 넣어준다.)
if node.left == nil && node.right == nil {
result += sumVal
} else {
if let left = node.left {
stack.append((left, sumVal))
}
if let right = node.right {
stack.append((right, sumVal))
}
}
}
return result
}
}
반응형
'알고리즘' 카테고리의 다른 글
[LinkedList] remove-nth-node-from-end-of-list - LeetCode Swift (0) | 2021.07.23 |
---|---|
[완전탐색] 카펫 - 프로그래머스 Swift (0) | 2021.07.22 |
[정렬] 병합정렬 Swift (0) | 2021.07.20 |
[정렬] H-Index 프로그래머스 Swift (0) | 2021.07.19 |
[Queue] 다리를 지나는 트럭 - 프로그래머스 Swift (0) | 2021.07.15 |