Leetcode #107. 이진 트리 레벨 순서 탐색 II

발행: (2026년 4월 16일 AM 05:24 GMT+9)
2 분 소요
원문: Dev.to

Source: Dev.to

문제

이진 트리의 루트가 주어지면, 노드 값들의 bottom‑up 레벨 순서 순회를 반환한다 (즉, 왼쪽에서 오른쪽으로, 레벨별로 leaf에서 root까지).

예시

  • Input: root = [3,9,20,null,null,15,7]
  • Input: root = [1]
  • Input: root = []

제약 조건

  • 트리의 노드 수는 [0, 2000] 범위이다.

토론

재귀 함수를 사용하면 각 레벨을 키로 하여 위에서 아래로 만난 노드 값들의 리스트를 매핑하는 맵을 만들 수 있다. 이 맵을 만든 뒤, 수집된 리스트들을 뒤집어 bottom‑up 순서를 만든다.

솔루션 (Java)

class Solution {
    public HashMap> getRestOfTree(int level, TreeNode t) {
        int value = t.val;
        List root = new ArrayList<>();
        root.add(value);
        HashMap> tree = new HashMap<>();
        tree.put(level, root);

        if (t.left == null && t.right == null) {
            return tree;
        } else {
            int nextLevel = level + 1;
            if (t.left == null) {
                HashMap> rightSubtree = getRestOfTree(nextLevel, t.right);
                tree.putAll(rightSubtree);
                return tree;
            } else if (t.right == null) {
                HashMap> leftSubtree = getRestOfTree(nextLevel, t.left);
                tree.putAll(leftSubtree);
                return tree;
            } else {
                HashMap> leftSubtree = getRestOfTree(nextLevel, t.left);
                HashMap> rightSubtree = getRestOfTree(nextLevel, t.right);
                HashMap> restSubtree = new HashMap<>();

                for (Integer key : leftSubtree.keySet()) {
                    if (rightSubtree.containsKey(key)) {
                        List rightSubtreeList = rightSubtree.get(key);
                        List leftSubtreeList = leftSubtree.get(key);
                        leftSubtreeList.addAll(rightSubtreeList);
                        leftSubtree.replace(key, leftSubtreeList);
                    }
                }

                for (Integer key : rightSubtree.keySet()) {
                    if (!leftSubtree.containsKey(key)) {
                        List rightSubtreeList = rightSubtree.get(key);
                        restSubtree.put(key, rightSubtreeList);
                    }
                }

                tree.putAll(leftSubtree);
                tree.putAll(restSubtree);
                return tree;
            }
        }
    }

    public List> levelOrderBottom(TreeNode root) {
        if (root == null) return new ArrayList<>();
        HashMap> tree = getRestOfTree(1, root);
        List> values = new ArrayList<>();
        for (Integer key : tree.keySet()) {
            List nodes = tree.get(key);
            values.add(nodes);
        }
        Collections.reverse(values);
        return values;
    }
}
0 조회
Back to Blog

관련 글

더 보기 »

SMS를 Notion으로

오늘 SMS‑to‑Notion 파이프라인을 연결했습니다. Twilio가 메시지를 수신하고, Make가 오케스트레이션을 수행하며, 작은 PHP 엔드포인트가 파일 업로드를 처리하고, 구조화된 레코드가 저장됩니다.