[抄题]:
给定一个二叉树,像这样收集树节点:收集并移除所有叶子,重复,直到树为空。
给出一个二叉树:
1
/
2 3
/
4 5
返回 [[4, 5, 3], [2], [1]]
.
[暴力解法]:
时间分析:
空间分析:
[思维问题]:
- 觉得要用BFS。不知道用dfs怎么求高度:max(左,右)+1,这是高度的定义吧
- 只知道怎么摘,不知道要去尝试用数学表示出来:第k层扒下来的叶子节点,高度也是k
- 不知道怎么把一层的节点都存在一个hashmap中,觉得一个key不是只能存一个value么:hashmap的value可以存链表,不只可以存次数。
[一句话思路]:
相同高度的叶子节点在相同高度摘下来
[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):
[画图]:
[一刷]:
- 以前的DFS函数没有输出,这里DFS可以有输出,不知道为什么:因为不可能主函dfs一次输出一次,干脆在dfs中全部输出。
- java8对哈希表的俩新方法是:putifabsent,getordefault
- 先写总表达式bfs(某节点),再写具体操作。实际执行是调用-调用-调用-调用……直到从最底端节点开始,所以是完全不应该有循环的。
[二刷]:
[三刷]:
[四刷]:
[五刷]:
[五分钟肉眼debug的结果]:
[总结]:
- 先写总表达式bfs(某节点),再写具体操作。实际执行是调用-调用-调用-调用……直到从最底端节点开始,所以是完全不应该有循环的。
[复杂度]:Time complexity: O(n) Space complexity: O(n)
[英文数据结构或算法,为什么不用别的数据结构或算法]:
- 不知道怎么把一层的节点都存在一个hashmap中,觉得一个key不是只能存一个value么:hashmap的value可以存链表,不只可以存次数。
[其他解法]:
[Follow Up]:
[LC给出的题目变变变]:
Find Leaves of Binary Tree
[代码风格] :
/** * Definition of TreeNode: * public class TreeNode { * public int val; * public TreeNode left, right; * public TreeNode(int val) { * this.val = val; * this.left = this.right = null; * } * } */ public class Solution { /* * @param root: the root of binary tree * @return: collect and remove all leaves */ HashMap<Integer, List<Integer>> map = new HashMap<>(); public List<List<Integer>> findLeaves(TreeNode root) { //corner case List<List<Integer>> ans = new LinkedList<>(); int max_height = bfs(root); for (int d = 1; d <= max_height; d++) { ans.add(map.get(d)); } return ans; } //bfs //corner case int bfs(TreeNode curt) { if (curt == null) { return 0; } int d = Math.max(bfs(curt.left), bfs(curt.right)) + 1; map.putIfAbsent(d, new LinkedList<Integer>()); map.get(d).add(curt.val); return d; } }