Leetcode - vertical-order-traversal-of-a-binary-tree
https://leetcode.com/problems/vertical-order-traversal-of-a-binary-tree/
Given a binary tree, return the vertical order traversal of its nodes values.
For each node at position (X, Y), its left and right children respectively will be at positions (X-1, Y-1) and (X+1, Y-1).
Running a vertical line from X = -infinity to X = +infinity, whenever the vertical line touches some nodes, we report the values of the nodes in order from top to bottom (decreasing Y coordinates).
If two nodes have the same position, then the value of the node that is reported first is the value that is smaller.
Return an list of non-empty reports in order of X coordinate. Every report will have a list of values of nodes.
Example 1:
Input: [3,9,20,null,null,15,7] Output: [[9],[3,15],[20],[7]] Explanation: Without loss of generality, we can assume the root node is at position (0, 0): Then, the node with value 9 occurs at position (-1, -1); The nodes with values 3 and 15 occur at positions (0, 0) and (0, -2); The node with value 20 occurs at position (1, -1); The node with value 7 occurs at position (2, -2).
Use bfs to traverse the tree, store a hash: hd -> tree value
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
type TreeWithDistance struct {
node *TreeNode
hd int
level int
}
func verticalTraversal(root *TreeNode) [][]int {
if root == nil {
return [][]int{}
}
queue := []*TreeWithDistance{{node: root, hd: 0, level: 0}}
hash := map[int][]*TreeWithDistance{}
min := math.MaxInt32
max := math.MinInt32
level := 0
for len(queue) != 0 {
size := len(queue)
for i := 0; i < size; i++ {
tmp := queue[i]
hd := tmp.hd
node := tmp.node
hash[hd] = append(hash[hd], tmp)
if node.Left != nil {
queue = append(queue, &TreeWithDistance{
node: node.Left,
hd: hd - 1,
level: level,
})
}
if node.Right != nil {
queue = append(queue, &TreeWithDistance{
node: node.Right,
hd: hd + 1,
level: level,
})
}
if min > hd {
min = hd
}
if max < hd {
max = hd
}
}
queue = queue[size:]
level++
}
result := [][]int{}
for i := min; i <= max; i++ {
if val, ok := hash[i]; ok {
sort.Slice(val, func(i, j int) bool {
if val[i].hd < val[j].hd {
return true
}
if val[i].hd > val[j].hd {
return false
}
if val[i].level < val[j].level {
return true
}
if val[i].level > val[j].level {
return false
}
return val[i].node.Val < val[j].node.Val
})
tmpResult := []int{}
for _, n := range val {
tmpResult = append(tmpResult, n.node.Val)
}
result = append(result, tmpResult)
}
}
return result
}
Feb 05, 2022 01:03:27 PM
We have been waiting for a long period of time where we can get an amazing Instruction that can be followed for long time.
May 27, 2024 05:55:16 PM
am overwhelmed by your post with such a nice topic. Usually I visit your blogs and get updated through the information you include but today’s blog would be the most appreciable. Well done!
Jul 31, 2024 02:52:37 PM
sex story in hindi
Jul 31, 2024 02:53:35 PM
join our service