먼저 트리에서 각 노드가 m개 이하의 자식을 갖고 있으면 m-ary 트리 (다항 트리, 다진 트리) 라고 한다.
여기서 m=2일 때 이진트리라고 구분하여 부른다.
Maximum Depth of Binary Tree - LeetCode
그저 깊이만을 확인하면 되기 때문에, left child 또는 right child 로 traverse하며 max인 depth를 찾는다. (left, right 둘 다 가봐야 함 - 따라서 재귀적으로 풀어야 한다 )
이 문제에서는 root노드만 존재하는 상황도 depth가 1인 것으로 하고 있다
(:05)
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public int max = 0;
public int maxDepth(TreeNode root) {
/*
left or Right child로 traverse 해 나갈 수록 depth가 깊어진다.
*/
dfs(0,root);
return max;
}
public void dfs(int d,TreeNode root){
if(root == null){
max = Math.max(d,max);
return;
}
dfs(d+1,root.left);
dfs(d+1,root.right);
}
}
더 간단한 풀이는 아래와 같다
class Solution {
public int maxDepth(TreeNode root) {
if (root == null) {
return 0;
}
return 1 + Math.max(maxDepth(root.left), maxDepth(root.right));
}
}
파이썬에서 큐는 “list”로도 가능하나 “deque” 자료형 사용시, doubly linked list로 구성되어있어, 큐와 스택 연산을 모두 자유롭게 활용가능할 뿐 아니라, 양방향 모두 O(1)에 추출할 수 있다.
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def maxDepth(self, root: Optional[TreeNode]) -> int:
if root is None:
return 0
queue = collections.deque([root]) # deque 자료구조
depth = 0
while queue:
depth += 1
# n 레벨의 모든 노드를 pop 하여 -> 인접노드(자식노드)들을 q에 넣는 과정
for _ in range(len(queue)):
cur_root = queue.popleft() # deque에서 popleft는 q상의 front를 추출
if cur_root.left:
queue.append(cur_root.left)
if cur_root.right:
queue.append(cur_root.right)
# BFS 반복 횟수 ==> 깊이
return depth