366. Find Leaves of Binary Tree

Given a binary tree, collect a tree's nodes as if you were doing this: Collect and remove all leaves, repeat until the tree is empty.
Example:
Given binary tree

          1
         / \
        2   3
       / \     
      4   5    

Returns [4, 5, 3], [2], [1].

Solution1:递归 Post-order Divide&Conquer Bottom-up向上传递

思路: �Divide 左右树,Conquer求出距leaf最大距离max_dist 并将其向上传递,对应添加到result_list
1a写法先求出了height,建好了固定长度的结果。
但其实不用,其实根据遍历顺序发现最大距离是若增一定连续,所以不用提前建好result_list,每次超过后动态增加即可,如写法2a。
Time Complexity: O(N) Space Complexity: O(N) 递归缓存

Solution1a Code:

class Solution {
    public List> findLeaves(TreeNode root) {
        // build result list
        int height = getMaxHeight(root);
        List> result = new ArrayList>();
        for(int i = 0; i < height; i++) result.add(new ArrayList());
        
        // bottom-up dfs
        dfsHelper(result, root);
        return result;
    }
    private int dfsHelper(List> result, TreeNode node) {
        if(node == null) return -1;
            
        int max_dist = 1 + Math.max(dfsHelper(result, node.left), dfsHelper(result, node.right));
        result.get(max_dist).add(node.val);
        
        return max_dist;
    }
    
    private int getMaxHeight(TreeNode root) {
        if(root == null) return 0;
        return 1 + Math.max(getMaxHeight(root.left), getMaxHeight(root.right));
    }
}

Solution2a Code:

class Solution {
    public List> findLeaves(TreeNode root) {
        List> result = new ArrayList<>();
        if(root == null) return result;
        dfs(root, result);
        return result;
    }
    private int dfs(TreeNode node, List> result) {
        if(node == null) return 0;
        int left_d = dfs(node.left, result);
        int right_d = dfs(node.right, result);
        
        int level = Math.max(left_d, right_d) + 1;
        if(level > result.size()) result.add(new ArrayList<>());
        
        result.get(level - 1).add(node.val);
        return level;
    }
}

你可能感兴趣的:(366. Find Leaves of Binary Tree)