zoukankan      html  css  js  c++  java
  • 二叉树垂直遍历 · Binary Tree Vertical Order Traversal

    [抄题]:

    给定二叉树,返回其节点值的垂直遍历顺序。 (即逐列从上到下)。
    如果两个节点在同一行和同一列中,则顺序应 从左到右

    给定一个二叉树 {3,9,20,#,#,15,7}

       3
      /
     /  
     9  20
        /
       /  
      15   7
    

    返回垂直遍历顺序:[[9],[3,15],[20],[7]]

    给定一个二叉树 {3,9,20,#,#,15,7}

         3
        /
       /  
       9   8
      /  /
     /  /  
     4  01   7
    

    返回垂直遍历顺序:[[4],[9],[3,0,1],[8],[7]]

     [暴力解法]:

    时间分析:

    空间分析:

    [思维问题]:

    1. 完全不知道怎么找出数学关系,找出变化关系:列数从小到大,同一列时行数从小到大,从左到右
    2. 左到右要用bfs来实现:添加一个点、扩展;添加一个点、扩展

    [一句话思路]:

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

    [画图]:

    [一刷]:

    1. 不知道bfs怎么写,怎么扩展:树上进行的BFS是用左右节点来扩展
    2. queue是用linkedlist实现的,不要死记硬背,直接联想图吧 用的是.poll()方法
    3. 已经创建出了qcol对象,判断它是否为空,用isempty(),没有对象才用null,要理解含义

    [二刷]:

    [三刷]:

    [四刷]:

    [五刷]:

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

    [总结]:

    树上进行的BFS是用左右节点来扩展的

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

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

    1. 每一列后面都是数字链表,用hashmap的value存储数字链表,和叶子顺序遍历相同
    2. 用两个队列:列数也是不断添加一个列、扩展到新涉及的列;添加一个列、扩展到新涉及的列
    3. hash.keySet()方法(方法也符合骆驼命名法)表示取出哈希表的所有key,Collections.min方法表示取出没有排序的哈希表的其最小值

    [其他解法]:

    [Follow Up]:

    [LC给出的题目变变变]:

     [代码风格] :

    /**
     * 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 tree
         * @return: the vertical order traversal
         */
        public List<List<Integer>> verticalOrder(TreeNode root) {
            //corner case
            List<List<Integer>> ans = new ArrayList<>();
            HashMap<Integer, List<Integer>> hash = new HashMap<>();
            
            if (root == null) {
                return ans;
            }
            Queue<Integer> qCol = new LinkedList<>();
            Queue<TreeNode> qNode = new LinkedList<>();
            //bfs
            qCol.offer(0);
            qNode.offer(root);
            
            while (!qCol.isEmpty()) {
                int col = qCol.poll();
                TreeNode node = qNode.poll();
                
                hash.putIfAbsent(col,new ArrayList());
                hash.get(col).add(node.val);
                
                if (node.left != null) {
                    qCol.offer(col - 1);
                    qNode.offer(root.left);
                }
                
                if (node.right != null) {
                    qCol.offer(col + 1);
                    qNode.offer(root.right);
                }
            }
            
            for (int i = Collections.min(hash.keySet()); //
            i <= Collections.max(hash.keySet()); i++) {
                ans.add(hash.get(i));
            }
            
            return ans;
        }
    }
    View Code
  • 相关阅读:
    jquery Flexigrid只选择一行,增加双击事件,获取数据库ID
    [工具库]JOJSONBuilder工具类——一键把多个bean对象数据转换为JSON格式数据
    java 观察者模式
    [工具库]JOXMLBuilder工具类——一键把多个bean对象数据转换为XML格式数据
    JVM原理
    WEB项目的分层结构
    一刻钟精通正则表达式
    [Java]Stack栈和Heap堆的区别(终结篇)[转]
    [java]二、八、十、十六进制之间的转换
    java 适配器模式
  • 原文地址:https://www.cnblogs.com/immiao0319/p/8453184.html
Copyright © 2011-2022 走看看