[LeetCode] 314. Binary Tree Vertical Order Traversal
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:
- Given binary tree
[3,9,20,null,null,15,7]
,3 /\ / \ 9 20 /\ / \ 15 7
return its vertical order traversal as:[ [9], [3,15], [20], [7] ]
- Given binary tree
[3,9,8,4,0,1,7]
,3 /\ / \ 9 8 /\ /\ / \/ \ 4 01 7
return its vertical order traversal as:[ [4], [9], [3,0,1], [8], [7] ]
- Given binary tree
[3,9,8,4,0,1,7,null,null,null,2,5]
(0's right child is 2 and 1's left child is 5),3 /\ / \ 9 8 /\ /\ / \/ \ 4 01 7 /\ / \ 5 2
return its vertical order traversal as:[ [4], [9,5], [3,0,1], [8,2], [7] ]
Thought process:
Use a hash map of integer => list of integers. The key is the horizontal distance to the root. The value is a list of nodes whose distance to root is the key. Since a hash map's key set does not have order, I need to use two variables to keep track of left and right boundaries. There won't be gaps between left and right because to reach to the far left or right, there must be a parent node in the middle.
Solution:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { class DistNode { int distance; TreeNode treeNode; DistNode(int distance, TreeNode treeNode) { this.distance = distance; this.treeNode = treeNode; } } public List<List<Integer>> verticalOrder(TreeNode root) { List<List<Integer>> list = new ArrayList<>(); if (root == null) { return list; } Map<Integer, List<Integer>> map = new HashMap<>(); Queue<DistNode> queue = new LinkedList<>(); queue.offer(new DistNode(0, root)); int l = 0; int r = 0; while (!queue.isEmpty()) { DistNode node = queue.poll(); int distance = node.distance; if (!map.containsKey(distance)) { map.put(distance, new ArrayList<>()); } map.get(distance).add(node.treeNode.val); l = Math.min(l, distance); r = Math.max(r, distance); TreeNode left = node.treeNode.left; if (left != null) { queue.offer(new DistNode(distance - 1, left)); } TreeNode right = node.treeNode.right; if (right != null) { queue.offer(new DistNode(distance + 1, right)); } } for (int i = l; i <= r; i++) { list.add(map.get(i)); } return list; } } |
Time complexity: O(n).
Comments
Post a Comment