Google 태그 관리자 아이콘

알고리즘 풀이

.leetcode(102. Binary Tree Level Order Traversal)

silvergoni 2022. 5. 11. 21:55
반응형

https://leetcode.com/problems/binary-tree-level-order-traversal/

 

2. 2022/05/11 시도

소요시간: 4분(iterative), 5분(recursive)

// iterative
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> ret = new ArrayList<>();
        if (root == null) {
            return ret;
        }

        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        
        while(!queue.isEmpty()) {
            int size = queue.size();
            List<Integer> inner = new ArrayList<>();
            for (int i=0; i<size; i++) {
                TreeNode node = queue.poll();
                inner.add(node.val);
                
                if (node.left != null) {
                    queue.offer(node.left);
                }
                
                if (node.right != null) {
                    queue.offer(node.right);
                }
            }
            ret.add(inner);
        }
        
        return ret;
    }
}
// recursive
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> ret = new ArrayList<>();
       
        doLevelOrder(root, 0, ret);
        
        return ret;
    }
    
    private void doLevelOrder(TreeNode root, int depth, List<List<Integer>> ret) {
        if (root == null) {
            return;
        }
        
        if (ret.size() == depth) {
            List<Integer> inner = new ArrayList<>();
            inner.add(root.val);
            ret.add(inner);
        } else {
            ret.get(depth).add(root.val);
        }
        
        doLevelOrder(root.left, depth+1, ret);
        doLevelOrder(root.right, depth+1, ret);
        
    }
}

풀이 접근 과정

iterative
- bfs를 queue로 푸는 전형적인 문제다.
- queue를 레벨별로 분리함으로 층별로 size를 미리 받아놓고 그만큼만 돌린다.
- 레벨이 끝날때마다 ret에 저장하면 끝

recursive
- depth를 넘겨서 위치를 확인한다.
- ret.size()는 전체 depth의 깊이와 같다. depth가 size가 같다는 것은 해당 depth에 처음으로 진입함을 의미함으로 list를 만들어준다.
- 이미 진입한 depth에는 list가 만들어져있으므로 add만 해주면 된다.

 

느낀점

  • iterative는 거의 외우다시피 해서 그런지 쉽게 풀렸다.
  • recurisve는 size와 depth를 이용해서 푸는 문제가 많았떤 것으로 기억해서 이런 풀이를 익혀두면 좋겠다.

 

1. 2021/01/21 시도

소요시간: 10분

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> result = new ArrayList<>();
        if (root == null) {
            return result;
        }
        LinkedList<TreeNode> queue = new LinkedList<>();
        queue.push(root);

        while (!queue.isEmpty()) {
            List<Integer> level = new ArrayList<>();
            LinkedList<TreeNode> next = new LinkedList<>();
            while(!queue.isEmpty()) {
                TreeNode cur = queue.pollLast();
                if (cur.left != null) next.push(cur.left);
                if (cur.right != null) next.push(cur.right);
                level.add(cur.val);
            }
            result.add(level);
            queue = next;
        }

        return result;
    }
}

풀이 접근 과정

iterative하게 queue를 쓰고 쌓인걸 모두 pop하면서 저장하면 되겠다.

 

느낀점

  • recursive하게는 딱 안 떠올랐는데 level을 파라미터 추가 변수로 주면 잘된다.

알고리즘 정리노트: .leetcode(알고리즘 문제풀이 접근)

반응형