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<List<Integer>> findLeaves(TreeNode root) {
// build result list
int height = getMaxHeight(root);
List<List<Integer>> result = new ArrayList<List<Integer>>();
for(int i = 0; i < height; i++) result.add(new ArrayList<Integer>());
// bottom-up dfs
dfsHelper(result, root);
return result;
}
private int dfsHelper(List<List<Integer>> 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<List<Integer>> findLeaves(TreeNode root) {
List<List<Integer>> result = new ArrayList<>();
if(root == null) return result;
dfs(root, result);
return result;
}
private int dfs(TreeNode node, List<List<Integer>> 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;
}
}