문제
- 문제 링크
- 이진 트리
root
와 두 정수 val
, depth
가 주어진다. tree
의 depth
위치에 val
값을 갖는 노드를 추가해야 한다. root
는 depth가 1이다.
- 노드를 추가할 때는 아래 규칙을 따른다.
- 트리의 depth-1에 있는 null이 아닌 노드를
cur
라고 한다면, val
값을 갖는 노드 두개를 각각 cur
의 왼쪽, 오른쪽 자식 노드로 추가해야 한다.
- 기존에 있던
cur
의 왼쪽 자식 노드는 새로 추가된 노드의 왼쪽 자식 노드로 들어가야 한다.
- 기존에 있던
cur
의 오른쪽 자식 노드는 새로 추가된 노드의 오른쪽 자식 노드로 들어가야 한다.
- 만약
depth
가 1로 주어지면 val
값을 갖는 노드를 만들고, 왼쪽 자식 노드가 root
인 노드를 반환한다.
- 제약 조건
- 트리에 있는 노드 개수:
[1, 10^4]
- 트리의 깊이:
[1, 10^4]
- 노드 값 범위:
-100 <= Node.val <= 100
- 주어지는
val
범위: -10^5 <= val <= 10^5
- 주어지는
depth
범위: 1 <= depth <= the depth of tree + 1
- 예시

풀이
풀기 전
- 트리를 탐색하다가 특정 깊이에 도착했을 때, 규칙에 맞게 새로운 노드를 껴넣으면 된다.
- 주어진 예시에서는 노드가 두 개만 추가되고 있어서 헷갈릴 수 있는데, depth-1에 있는 모든 노드에 새로운 자식 노드를 추가해야 한다. 주어진 이진 트리가 꽉 차있는 트리(perfect binary tree)라면 추가되는 노드 개수는 2^(depth-1)개이다.
코드
class Solution {
private void traverse(TreeNode node, int val, int nowDepth, int targetDepth) {
if (node == null)
return;
if (nowDepth + 1 == targetDepth) {
node.left = new TreeNode(val, node.left, null);
node.right = new TreeNode(val, null, node.right);
return;
}
traverse(node.left, val, nowDepth+1, targetDepth);
traverse(node.right, val, nowDepth+1, targetDepth);
}
public TreeNode addOneRow(TreeNode root, int val, int depth) {
if (depth == 1)
return new TreeNode(val, root, null);
traverse(root, val, 1, depth);
return root;
}
}
푼 후
- 이전 문제들과 비슷하게 탐색하면서 조건에 맞게 풀면 된다.
- 최대 노드 개수만큼 탐색하므로 트리에 있는 총 노드 개수를
n
이라고 하면 시간 복잡도는 O(n)
이다. 재귀 함수를 최대 n
개만큼 들어갈 수 있으므로 공간 복잡도도 O(n)
이다.