Skip to content

Commit f64d420

Browse files
add 987
1 parent 32907cb commit f64d420

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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy