leetcode.com/problems/minimum-depth-of-binary-tree/
Minimum Depth of Binary Tree - 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
안녕하세요!! 짭짭이 입니다!
트리형 문제 인데요!
일단,,,,, 문제를 풀면서 당황 스러웠던것이,,, 지금까지 트리 문제는 거의 배열 형태로 입력이 주어지고
[][] 이차원 배열 형태로 풀었습니다.
만약에
3
/ \
9 20
/ \
15 7
이렇게 주어지면 [0][3] / [1][9,20] / [2][15,7] 이렇게 만들어서 사용했었는데,,,
이 문제는 연결 리스트로 주어지기 때문에,,, 테스트 용 입력을 만들기 위해서 배열로 트리를 만드는 함수를 만들어야 해서
쫌 곤란한 것이 없지 않아 있었지만, 풀었습니다
** 문제 **
간단합니다. 그냥 루트 노드에서 모든 리프 노드가 null 인 가장 가까운 노드의 길이를 출력해주면 됩니다.
** 저의 풀이 **
저는 총 두가지 방법으로 풀었습니다.
처음에 풀 때는 DFS로 풀었습니다. 그냥 DFS라고 하긴 그렇고 재귀 함수 입니다.
func minDepthDFS(_ root: TreeNode?) -> Int {
guard let root = root else {return 0 }
if root.left == nil && root.right == nil {
return 1}
if root.left != nil && root.right == nil {
return minDepth(root.left) + 1
}
else if root.right != nil && root.left == nil {
return minDepth(root.right) + 1
}
return min(minDepth(root.left) + 1 , minDepth(root.right) + 1)
}
방법은 아래서 부터 위로 쭉쭉 더해가는 방식 입니다.
만약 한쪽만 노드가 있을 경우 있는 쪽으로만 재귀를 돌려주고
둘다 있다면 둘중에 작은 값을 반환 해줍니다.
BFS 방식은
func minDepth(_ root: TreeNode?) -> Int {
guard let root = root else {return 0}
var nodeInfoList : [(TreeNode?, Int)] = [(root,1)]
while !nodeInfoList.isEmpty {
if let nodeInfo = nodeInfoList.first {
nodeInfoList.remove(at: 0)
let node = nodeInfo.0
let depth = nodeInfo.1
if node?.left == nil && node?.right == nil {
return depth
}
else{
if node?.left == nil && node?.right != nil {
nodeInfoList.append((node?.right, depth + 1))
}
else if node?.left != nil && node?.right == nil {
nodeInfoList.append((node?.left, depth + 1))
}
else{
nodeInfoList.append((node?.right, depth + 1))
nodeInfoList.append((node?.left, depth + 1))
}
}
}
}
return 0
}
이렇게 투플을 이용해서 풀었습니다.
깊이를 구하는 문제이기 때문에 처음으로 둘다 없을 경우가 가장 가까운 것이고
따라서 현재 깊이를 반환해주는 쪽으로 했습니다.
** 다른 사람의 풀이 **
sairamkotha (DFS)
final class Solution {
var minDepth = Int.max
func minDepth(_ root: TreeNode?) -> Int {
if root == nil {
return 0
}
dfs(root, 1)
return minDepth
}
func dfs(_ root: TreeNode?, _ level: Int) {
if root == nil {
return
}
if root!.left == nil && root!.right == nil {
minDepth = min(level, minDepth)
}
dfs(root!.left, level + 1)
dfs(root!.right, level + 1)
}
}
diegostamigni (BFS)
class Solution {
func minDepth(_ root: TreeNode?) -> Int {
guard let root = root else { return 0 }
var minLevel = 0
var queue = [root]
while !queue.isEmpty {
minLevel += 1
let count = queue.count
for i in 0..<count {
let curr = queue.removeFirst()
if curr.left == nil && curr.right == nil {
return minLevel
}
if let right = curr.right {
queue.append(right)
}
if let left = curr.left {
queue.append(left)
}
}
}
return minLevel
}
}
그리고 테스트용 케이스를 만드는 Tree는 이렇게 만들었습니다.
시작할 때 배열을 주시고 index 0 부분에 아무 숫자나 넣어주시면 됩니다.
func makeThree(_ array : [Int?], _ index : Int) -> TreeNode?{
if index >= array.count {return nil}
if array[index] == nil {return nil}
let newNode = TreeNode(array[index])
newNode.left = makeThree(array, index * 2)
newNode.right = makeThree(array, index * 2 + 1)
return newNode
}
'Xcode > Swift - Algorithm' 카테고리의 다른 글
Swift) LeetCode(Easy) - Word-Pattern (Hash&String) (0) | 2020.08.20 |
---|---|
Swift) LeetCode(Easy) - Symmetric Tree (BFS&Recursive) (0) | 2020.08.18 |
Swift) 프로그래머스(Lv1) - 핸도폰 번호 가리기 (String) (0) | 2020.08.16 |
Swift) LeetCode(Easy) - House Robber (DP) (0) | 2020.08.15 |
Swift) LeetCode(Easy) - Kth Largest Element In A Stream(Priority Queue) (1) | 2020.08.14 |
댓글