zoukankan      html  css  js  c++  java
  • 314. Binary Tree Vertical Order Traversal

    package LeetCode_314
    
    import java.util.*
    import kotlin.collections.ArrayList
    import kotlin.collections.HashMap
    
    /**
     * 314. Binary Tree Vertical Order Traversal
     * (Prime)
     * Given a binary tree, return the vertical order traversal of its nodes' values. (ie, from top to bottom, column by column).
    If two nodes are in the same row and column, the order should be from left to right.
    
    Examples 1:
    Input: [3,9,20,null,null,15,7]
      3
     /
    /  
    9  20
       /
      /  
     15   7
    Output:
    [
    [9],
    [3,15],
    [20],
    [7]
    ]
     * */
    class TreeNode(var `val`:Int){
        var left: TreeNode?=null
        var right: TreeNode?=null
    }
    
    class Node(root: TreeNode?, hd:Int){
        var root:TreeNode?=null
        var horizontalDistance = 0
        init{
            this.root = root
            this.horizontalDistance = hd
        }
    }
    
    class Solution {
        /*
        * solution: BFS+HashMap, BFS to traverse all node, and HashMap to save elements of each coordinate
        * Time complexity:O(n), Space complexity:O(n)
        * */
        fun verticalOrder(root: TreeNode?): List<List<Int>>{
            val result = ArrayList<ArrayList<Int>>()
            if (root==null){
                return result
            }
            //for the range of result
            var minHD = Int.MAX_VALUE
            var maxHD = Int.MIN_VALUE
            //key is coordinate, value is elements of this coordinate
            val map = HashMap<Int,ArrayList<Int>>()
            val queue = LinkedList<Node>()
            //the coordinate root is 0, root.left should be -1, root.right should be +1
            val starting = Node(root,0)
            queue.offer(starting)
            while (queue.isNotEmpty()){
                val cur = queue.pop()
                if (cur != null) {
                    map.putIfAbsent(cur.horizontalDistance, ArrayList())
    
                    minHD = Math.min(minHD, cur.horizontalDistance)
                    maxHD = Math.max(maxHD, cur.horizontalDistance)
    
                    if (cur.root != null) {
                        map.get(cur.horizontalDistance)!!.add(cur.root!!.`val`)
    
                        if (cur.root!!.left!=null){
                            queue.offer(Node(cur.root!!.left,cur.horizontalDistance - 1))
                        }
                        if (cur.root!!.right!=null){
                            queue.offer(Node(cur.root!!.right,cur.horizontalDistance + 1))
                        }
                    }
                }
            }
    
            for (i in minHD..maxHD){
                if (map.get(i)!=null){
                    result.add(map.get(i)!!)
                }
            }
    
            return result
        }
    }
  • 相关阅读:
    java 21
    maven POM.xml 标签详解
    shell sed 替代1
    lua的table库中的常用函数总结
    Lua字符串及模式匹配
    lua文件读写
    qt添加lua支持
    关于c调用lua 对‘luaL_newstate()’未定义的引用的问题解决办法
    Lua开发环境
    linux安装lua相关编译报错
  • 原文地址:https://www.cnblogs.com/johnnyzhao/p/13430954.html
Copyright © 2011-2022 走看看