https://leetcode.com/problems/binary-tree-right-side-view
- 특정 뎁스의 최우측에 위치한 노드들을 구하면 된다.
➡️ 뎁스 단위로 최우측에 있는 노드가 어떤 노드인지 확인해야 한다.
➡️ 특정 뎁스 당 하나의 노드이므로, <인덱스, 노드>로 이루어진HashMap
을 활용할 수 있다.
🧐 BFS(Breath First Search)를 이용하자
while(큐가 비어있지 않음){
int size = 큐 사이즈;
for(int i=0 부터 size까지){
TreeNode n = 큐.remove();
map.put(뎁스, n.값);
do 큐에 자식 노드 삽입;
}
뎁스++;
}
BFS로 풀이해도 결국 트리의 뎁스를 알지 못하고, 이전 노드를 통해 하위 노드에 접근해야 하기 때문에 모든 노드를 순회해야 한다.
따라서 DFS로 풀이해도 성능이 동일할 것이라고 생각해 DFS로 풀이해보았다.
void recursive(TreeNode 노드, int 뎁스){
map.put(뎁스, 노드.val)
if(node.left != null) recursive(node.left, 뎁스 + 1);
if(node.right != null) recursive(node.right, 뎁스 + 1);
}
public List<Integer> rightSideView(TreeNode root) {
List<Integer> result = new ArrayList<Integer>();
rightView(root, result, 0);
return result;
}
public void rightView(TreeNode curr, List<Integer> result, int currDepth){
if(curr == null){
return;
}
if(currDepth == result.size()){
result.add(curr.val);
}
rightView(curr.right, result, currDepth + 1);
rightView(curr.left, result, currDepth + 1);
}
이 문제는 BFS로 풀이하는 것보다 DFS로 풀이하는 게 시간복잡도가 더 개선된 결과로 나왔다.
위의 문제 풀이 방식은 나의 DFS 풀이와 동일한 것 같다.
그런데 나처럼 Map
을 굳이 활용하지 않고, List
를 처음부터 활용해서 result.size
를 depth와 확인했다.
나의 풀이는 Map
을 활용해 마지막에 ArrayList
화를 따로 하기 때문에 생기는 추가적인 복잡도가 있을 거 같다.
따라서 이 풀이가 더 효율적인 것 같다.