zoukankan      html  css  js  c++  java
  • 二叉树叶子顺序遍历 · binary tree leaves order traversal

    [抄题]:

    给定一个二叉树,像这样收集树节点:收集并移除所有叶子,重复,直到树为空。

    给出一个二叉树:

               1
              / 
             2   3
            /      
           4   5    
    

    返回 [[4, 5, 3], [2], [1]].

     [暴力解法]:

    时间分析:

    空间分析:

    [思维问题]:

    1. 觉得要用BFS。不知道用dfs怎么求高度:max(左,右)+1,这是高度的定义
    2. 只知道怎么摘,不知道要去尝试用数学表示出来:第k层扒下来的叶子节点,高度也是k
    3. 不知道怎么把一层的节点都存在一个hashmap中,觉得一个key不是只能存一个value么:hashmap的value可以存链表,不只可以存次数。

    [一句话思路]:

    相同高度的叶子节点在相同高度摘下来

    [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

    [画图]:

    [一刷]:

    1. 以前的DFS函数没有输出,这里DFS可以有输出,不知道为什么:因为不可能主函dfs一次输出一次,干脆在dfs中全部输出。
    2. java8对哈希表的俩新方法是:putifabsent,getordefault
    3. 先写总表达式bfs(某节点),再写具体操作。实际执行是调用-调用-调用-调用……直到从最底端节点开始,所以是完全不应该有循环的。

    [二刷]:

    [三刷]:

    [四刷]:

    [五刷]:

      [五分钟肉眼debug的结果]:

    [总结]:

    1. 先写总表达式bfs(某节点),再写具体操作。实际执行是调用-调用-调用-调用……直到从最底端节点开始,所以是完全不应该有循环的。

    [复杂度]:Time complexity: O(n) Space complexity: O(n)

    [英文数据结构或算法,为什么不用别的数据结构或算法]:

    1. 不知道怎么把一层的节点都存在一个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;
        }
    }
    View Code
  • 相关阅读:
    RATE-MAX——alpha冲刺总结随笔
    RATE-MAX alpha冲刺第十天
    RATE-MAX alpha冲刺第九天
    团队作业第六次——Daily6+1站立式会议+β冲刺汇总
    问题总结(事后诸葛亮和组员交换事宜)
    凡事预则立
    测试随笔
    冲刺随笔
    alpha冲刺——第十天
    alpha冲刺——第九天
  • 原文地址:https://www.cnblogs.com/immiao0319/p/8452906.html
Copyright © 2011-2022 走看看