Skip to content

Commit dd1955a

Browse files
add 987
1 parent a063d61 commit dd1955a

File tree

3 files changed

+146
-0
lines changed

3 files changed

+146
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ Your ideas/fixes/algorithms are more than welcome!
5050
|994|[Rotting Oranges](https://leetcode.com/problems/rotting-oranges/)|[Solution](../master/src/main/java/com/fishercoder/solutions/_994.java) | O(m*2*n*2) | O(m*n) | |Easy| BFS
5151
|993|[Cousins in Binary Tree](https://leetcode.com/problems/cousins-in-binary-tree/)|[Solution](../master/src/main/java/com/fishercoder/solutions/_993.java) | O(n) | O(m) (m is length of the nodes that has the max number of nodes on the same level) | |Easy| Tree, BFS
5252
|989|[Add to Array-Form of Integer](https://leetcode.com/problems/add-to-array-form-of-integer/)|[Solution](../master/src/main/java/com/fishercoder/solutions/_989.java) | O(max(N, logk)) | O(max(N, logk)) | |Easy| Array
53+
|987|[Vertical Order Traversal of a Binary Tree](https://leetcode.com/problems/vertical-order-traversal-of-a-binary-tree/)|[Solution](../master/src/main/java/com/fishercoder/solutions/_987.java) | O(n) | O(n) | |Medium| Recursion
5354
|985|[Sum of Even Numbers After Queries](https://leetcode.com/problems/sum-of-even-numbers-after-queries/)|[Solution](../master/src/main/java/com/fishercoder/solutions/_985.java) | O(n) | O(n) | |Easy| Array
5455
|979|[Distribute Coins in Binary Tree](https://leetcode.com/problems/distribute-coins-in-binary-tree/)|[Solution](../master/src/main/java/com/fishercoder/solutions/_979.java) | O(n) | O(1) | |Medium| Recursion
5556
|977|[Squares of a Sorted Array](https://leetcode.com/problems/squares-of-a-sorted-array/)|[Solution](../master/src/main/java/com/fishercoder/solutions/_977.java) | O(nlogn) | O(1) | |Easy| Array
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package com.fishercoder.solutions;
2+
3+
import com.fishercoder.common.classes.TreeNode;
4+
5+
import java.util.*;
6+
7+
/**
8+
* 987. Vertical Order Traversal of a Binary Tree
9+
*
10+
* Given a binary tree, return the vertical order traversal of its nodes values.
11+
* 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).
12+
* 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).
13+
* If two nodes have the same position, then the value of the node that is reported first is the value that is smaller.
14+
* Return an list of non-empty reports in order of X coordinate. Every report will have a list of values of nodes.
15+
*
16+
* Example 1:
17+
*
18+
* 3
19+
* / \
20+
* 9 20
21+
* / \
22+
* 15 7
23+
*
24+
* Input: [3,9,20,null,null,15,7]
25+
* Output: [[9],[3,15],[20],[7]]
26+
* Explanation:
27+
* Without loss of generality, we can assume the root node is at position (0, 0):
28+
* Then, the node with value 9 occurs at position (-1, -1);
29+
* The nodes with values 3 and 15 occur at positions (0, 0) and (0, -2);
30+
* The node with value 20 occurs at position (1, -1);
31+
* The node with value 7 occurs at position (2, -2).
32+
*
33+
*
34+
* Example 2:
35+
*
36+
* 1
37+
* / \
38+
* 2 3
39+
* / \ / \
40+
* 4 5 6 7
41+
*
42+
* Input: [1,2,3,4,5,6,7]
43+
* Output: [[4],[2],[1,5,6],[3],[7]]
44+
* Explanation:
45+
* The node with value 5 and the node with value 6 have the same position according to the given scheme.
46+
* However, in the report "[1,5,6]", the node value of 5 comes first since 5 is smaller than 6.
47+
*
48+
* Note:
49+
*
50+
* The tree will have between 1 and 1000 nodes.
51+
* Each node's value will be between 0 and 1000.
52+
* */
53+
public class _987 {
54+
public static class Solution1 {
55+
/**credit: https://leetcode.com/problems/vertical-order-traversal-of-a-binary-tree/discuss/231148/Java-TreeMap-Solution*/
56+
public List<List<Integer>> verticalTraversal(TreeNode root) {
57+
TreeMap<Integer, TreeMap<Integer, PriorityQueue<Integer>>> map = new TreeMap<>();
58+
dfs(root, 0, 0, map);
59+
List<List<Integer>> list = new ArrayList<>();
60+
for (TreeMap<Integer, PriorityQueue<Integer>> ys : map.values()) {
61+
list.add(new ArrayList<>());
62+
for (PriorityQueue<Integer> nodes : ys.values()) {
63+
while (!nodes.isEmpty()) {
64+
list.get(list.size() - 1).add(nodes.poll());
65+
}
66+
}
67+
}
68+
return list;
69+
}
70+
71+
private void dfs(TreeNode root, int x, int y, TreeMap<Integer, TreeMap<Integer, PriorityQueue<Integer>>> map) {
72+
if (root == null) {
73+
return;
74+
}
75+
if (!map.containsKey(x)) {
76+
map.put(x, new TreeMap<>());
77+
}
78+
if (!map.get(x).containsKey(y)) {
79+
map.get(x).put(y, new PriorityQueue<>());
80+
}
81+
map.get(x).get(y).offer(root.val);
82+
dfs(root.left, x - 1, y + 1, map);
83+
dfs(root.right, x + 1, y + 1, map);
84+
}
85+
}
86+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package com.fishercoder;
2+
3+
import com.fishercoder.common.classes.TreeNode;
4+
import com.fishercoder.common.utils.TreeUtils;
5+
import com.fishercoder.solutions._987;
6+
import org.junit.BeforeClass;
7+
import org.junit.Test;
8+
9+
import java.util.Arrays;
10+
import java.util.List;
11+
12+
import static junit.framework.Assert.assertEquals;
13+
14+
public class _987Test {
15+
private static _987.Solution1 solution1;
16+
private static TreeNode root;
17+
private static List<List<Integer>> expected;
18+
private static List<List<Integer>> actual;
19+
20+
@BeforeClass
21+
public static void setup() {
22+
solution1 = new _987.Solution1();
23+
}
24+
25+
@Test
26+
public void test1() {
27+
root = TreeUtils.constructBinaryTree(Arrays.asList(3, 9, 20, null, null, 15, 7));
28+
expected = Arrays.asList(Arrays.asList(9), Arrays.asList(3, 15), Arrays.asList(20), Arrays.asList(7));
29+
actual = solution1.verticalTraversal(root);
30+
assertEquals(expected, actual);
31+
}
32+
33+
@Test
34+
public void test2() {
35+
root = TreeUtils.constructBinaryTree(Arrays.asList(1, 2, 3, 4, 5, 6, 7));
36+
expected = Arrays.asList(Arrays.asList(4), Arrays.asList(2), Arrays.asList(1, 5, 6), Arrays.asList(3), Arrays.asList(7));
37+
actual = solution1.verticalTraversal(root);
38+
assertEquals(expected, actual);
39+
}
40+
41+
@Test
42+
public void test3() {
43+
root = TreeUtils.constructBinaryTree(Arrays.asList(0, 5, 1, 9, null, 2, null, null, null, null, 3, 4, 8, 6, null, null, null, 7));
44+
TreeUtils.printBinaryTree(root);
45+
expected = Arrays.asList(Arrays.asList(9, 7), Arrays.asList(5, 6), Arrays.asList(0, 2, 4), Arrays.asList(1, 3), Arrays.asList(8));
46+
actual = solution1.verticalTraversal(root);
47+
assertEquals(expected, actual);
48+
}
49+
50+
@Test
51+
public void test4() {
52+
root = TreeUtils.constructBinaryTree(Arrays.asList(0, 2, 1, 3, null, null, null, 4, 5, null, 7, 6, null, 10, 8, 11, 9));
53+
TreeUtils.printBinaryTree(root);
54+
expected = Arrays.asList(Arrays.asList(4, 10, 11), Arrays.asList(3, 6, 7), Arrays.asList(2, 5, 8, 9), Arrays.asList(0), Arrays.asList(1));
55+
actual = solution1.verticalTraversal(root);
56+
assertEquals(expected, actual);
57+
}
58+
59+
}

0 commit comments

Comments
 (0)