[LeetCode 107] Binary Tree Level Order Traversal II

Oct 12, 2019


[LeetCode 107] Binary Tree Level Order Traversal II

문제 요약

하나의 이진트리가 주어졌을 때, 주어진 트리의 높이 별로, 역순(단말노드->루트)으로 리스트에 원소를 저장하여 반환

풀이

재귀함수를 활용하여 트리의 순회하면서 트리의 최대 깊이를 기록하고, 기록된 높이만큼 리스트를 할당한다.
트리에 대해 두 번째 순회를 진행하며 높이 별로 리스트에 원소를 추가한다.

코드

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    private List<List<Integer>> ret;
    private int tree_depth;
    
    private int chkDepth(TreeNode tn, int d) {
        if (tn == null) return d;
        return Math.max(chkDepth(tn.left, d + 1), chkDepth(tn.right, d + 1));
    }
    
    private void go(TreeNode tn, int d) {
        if (tn == null) return;
        ret.get(tree_depth - d - 1).add(tn.val);
        go(tn.left, d + 1);
        go(tn.right, d + 1);
    }
    
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        ret = new ArrayList<>();
        tree_depth = chkDepth(root, 0);
        for (int i = 0; i < tree_depth; i++) ret.add(new ArrayList<>());
        go(root, 0);
        return ret;
    }
}