# 20200109
https://ppt.cc/fO8Kex
Given a set of distinct integers, nums, return all possible subsets (the power set).
Note: The solution set must not contain duplicate subsets.
Input: nums = [1,2,3]
Output:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
```
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
helper(result, new ArrayList<>(), nums, 0);
return result;
}
[]
[], [1]
[], [1], [1, 2]
[], [1], [1, 2], [1, 2, 3]
[], [1], [1, 2], [1, 2, 3], [1, 3]
[], [1], [1, 2], [1, 2, 3], [1, 3], [2]
[], [1], [1, 2], [1, 2, 3], [1, 3], [2], [2, 3]
[], [1], [1, 2], [1, 2, 3], [1, 3], [2], [2, 3], [3]
public void helper(List<List<Integer>> result, List<Integer> tempList, int[] nums, int start) {
result.add(new ArrayList<>(tempList));
for (int i = start; i < nums.length; i++) {
tempList.add(nums[i]);
helper(result, tempList, nums, i + 1);
tempList.remove(tempList.size() - 1);
}
}
```
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:
Input: [1,2,3,4,5]
1
/ \
2 3
/ \
4 5
Output: [[4,5,3],[2],[1]]
Explanation:
1. Removing the leaves [4,5,3] would result in this tree:
1
/
2
2. Now removing the leaf [2] would result in this tree:
1
3. Now removing the leaf [1] would result in the empty tree:
[]
```
```public List<List<Integer>> findLeaves(TreeNode root) {
List<List<Integer>> leavesList = new ArrayList< List<Integer>>();
List<Integer> leaves = new ArrayList<Integer>();
while(root != null) {
if(isLeave(root, leaves))
root = null;
leavesList.add(leaves);
leaves = new ArrayList<Integer>();
}
return leavesList;
}
public boolean isLeave(TreeNode node, List<Integer> leaves) {
if (node.left == null && node.right == null) {
leaves.add(node.val);
return true;
}
if (node.left != null) {
if(isLeave(node.left, leaves)) node.left = null;
}
if (node.right != null) {
if(isLeave(node.right, leaves)) node.right = null;
}
return false;
}
```
```
public List<List<Integer>> findLeaves(TreeNode root) {
List<List<Integer>> list = new ArrayList<>();
findLeavesHelper(list, root);
return list;
}
// return the level of root
private int findLeavesHelper(List<List<Integer>> list, TreeNode root) {
if (root == null) {
return -1;
}
// 1
int leftLevel = findLeavesHelper(list, root.left); // 1
int rightLevel = findLeavesHelper(list, root.right); // 0
int level = Math.max(leftLevel, rightLevel) + 1;
if (list.size() == level) { // 0
list.add(new ArrayList<>()); // [4, 5], [2], [1]
}
list.get(level).add(root.val); // [4, 5, 3]
root.left = null;
root.right = null;
return level;
}
```