Binary Tree Right Side View - LeetCode
이진트리의 root가 주어졌을 때 자신의 우측 방향에서 바라봤을 때 보이는 노드들의 값을 위에서 아래방향으로 반환하라.
오른쪽에서 봤을 때라는 뜻은 각 레벨마다 오른쪽에 있는 값이라는 뜻이다.
그렇다면 레벨별로 탐색하는 것이 중요하다.
레벨별로 탐색은 어떻게 가능할까? BFS를 사용하면 된다.
다음의 작업을 처리하면 된다.
- 현재 레벨의 처리해야 할 노드 수를 기록한다.
- 해당 레벨의 모든 노드를 순회한다.
- 그 노드의 왼쪽, 오른쪽 자식이 있다면 큐에 추가한다.
- 해당 레벨의 마지막 노드이면 결과 리스트에 추가한다.
/**
* 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 List<Integer> rightSideView(TreeNode root) {
List<Integer> result = new ArrayList<>();
if (root == null) return result;
Queue<TreeNode> q = new LinkedList<>();
q.add(root);
while (!q.isEmpty()) {
int levelSize = q.size();
for (int i = 0; i < levelSize; i++) {
TreeNode node = q.poll();
if (i == levelSize - 1) {
result.add(node.val);
}
if (node.left != null) q.add(node.left);
if (node.right != null) q.add(node.right);
}
}
return result;
}
}
그런데 이 문제는 DFS로도 해결이 가능하다.
트리를 탐색해 나가면서 오른쪽 자식을 먼저 보면 당연히 오른쪽에서 바라보는 노드의 값을 얻을 수 있다.
문제는 이제 왼쪽 서브트리에서 레벨이 더 큰 자식이 나왔을 때이다.
이를 해결하기 위해 레벨과 찾은 오른쪽에서 바라봤을 때의 노드 개수를 연관 지어 처리해 줄 방법이 필요하다.
해당 레벨에는 하나의 정답 노드가 존재할 것이다. 따라서 저장된 노드의 개수와 레벨을 비교하면 된다.
/**
* 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 List<Integer> rightSideView(TreeNode root) {
List<Integer> result = new ArrayList<>();
if (root == null) return result;
dfs(0, root, result);
return result;
}
private void dfs(int level, TreeNode node, List<Integer> result) {
if (node == null) return;
if (level == result.size()) {
result.add(node.val);
}
dfs(level + 1, node.right, result);
dfs(level + 1, node.left, result);
}
}
'Algorithm > LeetCode' 카테고리의 다른 글
LeetCode 208 - Implement Trie (Prefix Tree) (0) | 2024.10.16 |
---|---|
LeetCode 17 - Letter Combinations of a Phone Number (0) | 2024.10.15 |
LeetCode 530 - Minimum Absolute Difference in BST (0) | 2024.10.15 |
LeetCode 228 - Summary Ranges (0) | 2024.10.14 |
LeetCode 36 - Valid Sudoku (0) | 2024.10.14 |