Leetcode Java Number of Good Leaf Nodes Pairs
업데이트:
문제
코드
/**
* 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 {
private int result;
public int countPairs(TreeNode root, int distance) {
this.result = 0;
this.dfs(root, distance);
return this.result;
}
private int[] dfs(TreeNode root, int distance) {
if (root == null) {
return new int[distance + 1];
} else if (root.left == null && root.right == null) {
int[] result = new int[distance + 1];
result[1]++;
return result;
} else {
int[] left = this.dfs(root.left, distance);
int[] right = this.dfs(root.right, distance);
for (int i = 1; i < left.length; i++) {
for (int j = distance - 1; j >= 0; j--) {
if (i + j <= distance) {
this.result += left[i] * right[j];
}
}
}
int[] result = new int[distance + 1];
for (int i = result.length - 2; i >= 1; i--) {
result[i + 1] = left[i] + right[i];
}
return result;
}
}
}
결과
설명
-
이진 트리 노드인 root의 리프 노드에서 root 노드까지 distance 이하만큼의 거리를 가진 좋은 노드 쌍을 찾는 문제이다.
-
전역 변수인 result는 리프 노드 쌍을 계산할 변수로, 0으로 초기화한다.
-
4번에서 정의한 dfs(TreeNode root, int distance) 메서드를 수행해준다.
- DFS 방식으로 리프 노드 쌍을 탐색할 dfs(TreeNode root, int distance)를 정의한다.
- root가 null인 탐색이 불가능한 경우, $distance + 1$ 크기의 빈 배열을 반환한다.
- root의 자식 노드가 없는 경우, $distance + 1$ 크기의 배열에 두 번째 값만 증가시킨 후 해당 배열을 반환한다.
- 위의 모든 경우가 아닌 경우, 아래를 수행한다.
- left와 right에 각 자식 노드를 이용하여 재귀 호출한 결과를 넣어준다.
- 1부터 left 길이 미만까지 i를 증가시키며, $distance - 1$부터 0 이상 까지 j를 감소시키며 전역 변수인 result에 좋은 노드 쌍의 갯수인 $left[i] \times right[j]$의 값을 더해준다.
- 위의 수행이 완료되면 $distance + 1$ 크기의 정수 배열에 역순으로 left와 right의 처음부터 값의 합을 넣어준 후 해당 배열을 반환한다.
- 4번의 수행이 완료되면 좋은 노드 쌍이 저장된 result를 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기