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
    }
}

 

posted @ 2020-08-04 01:07  johnny_zhao  阅读(112)  评论(0编辑  收藏  举报