|
8 | 8 | * }
|
9 | 9 | */
|
10 | 10 | class Solution {
|
11 |
| - class NewNode { |
12 |
| - TreeNode t; |
13 |
| - int x; |
14 |
| - int y; |
15 |
| - int level; |
16 |
| - |
17 |
| - NewNode(TreeNode t, int x, int y, int level) { |
18 |
| - this.t = t; |
19 |
| - this.x = x; |
20 |
| - this.y = y; |
21 |
| - this.level = level; |
22 |
| - } |
| 11 | + public List<List<Integer>> verticalTraversal(TreeNode root) { |
| 12 | + if (root == null) { |
| 13 | + return new ArrayList<>(); |
23 | 14 | }
|
24 |
| - |
25 |
| - int maxLeft; |
26 |
| - int maxRight; |
27 |
| - Map<Integer, List<NewNode>> map; |
28 |
| - |
29 |
| - public List<List<Integer>> verticalTraversal(TreeNode root) { |
30 |
| - maxLeft = 0; |
31 |
| - maxRight = 0; |
32 |
| - map = new HashMap<>(); |
33 |
| - |
34 |
| - helper(root, 0); |
35 |
| - |
36 |
| - List<List<Integer>> list = new ArrayList<>(); |
37 |
| - |
38 |
| - while (maxLeft <= maxRight) { |
39 |
| - if (map.containsKey(maxLeft)) { |
40 |
| - List<NewNode> temp = map.get(maxLeft); |
41 |
| - |
42 |
| - Collections.sort(temp, new Comparator<NewNode>() { |
43 |
| - @Override |
44 |
| - public int compare(NewNode o1, NewNode o2) { |
45 |
| - int c = Integer.valueOf(o1.x).compareTo(Integer.valueOf(o2.x)); |
46 |
| - if (c == 0) { |
47 |
| - c = Integer.valueOf(o2.y).compareTo(Integer.valueOf(o1.y)); |
48 |
| - } |
49 |
| - |
50 |
| - if (c == 0) { |
51 |
| - c = Integer.valueOf(o1.t.val).compareTo(Integer.valueOf(o2.t.val)); |
52 |
| - } |
53 |
| - |
54 |
| - return c; |
55 |
| - } |
56 |
| - }); |
57 |
| - |
58 |
| - List<Integer> valList = new ArrayList<>(); |
59 |
| - for (NewNode node : temp) { |
60 |
| - valList.add(node.t.val); |
61 |
| - } |
62 |
| - |
63 |
| - list.add(valList); |
64 |
| - } |
65 |
| - |
66 |
| - maxLeft++; |
| 15 | + Map<Integer, List<TreeLevel>> map = new TreeMap<>(); |
| 16 | + Queue<TreeLevel> queue = new LinkedList<>(); |
| 17 | + queue.add(new TreeLevel(root, 0, 0)); |
| 18 | + while (!queue.isEmpty()) { |
| 19 | + int size = queue.size(); |
| 20 | + while (size-- > 0) { |
| 21 | + TreeLevel removed = queue.remove(); |
| 22 | + map.computeIfAbsent(removed.xLevel, k -> new ArrayList<>()).add(removed); |
| 23 | + if (removed.node.left != null) { |
| 24 | + queue.add(new TreeLevel(removed.node.left, removed.xLevel - 1, removed.yLevel - 1)); |
67 | 25 | }
|
68 |
| - |
69 |
| - return list; |
70 |
| - } |
71 |
| - |
72 |
| - private void helper(TreeNode root, int level) { |
73 |
| - if (root == null) { |
74 |
| - return; |
| 26 | + if (removed.node.right != null) { |
| 27 | + queue.add(new TreeLevel(removed.node.right, removed.xLevel + 1, removed.yLevel - 1)); |
75 | 28 | }
|
76 |
| - |
77 |
| - NewNode node = new NewNode(root, 0, 0, level); |
78 |
| - Queue<NewNode> queue = new LinkedList<>(); |
79 |
| - |
80 |
| - queue.add(node); |
81 |
| - |
82 |
| - while (!queue.isEmpty()) { |
83 |
| - int size = queue.size(); |
84 |
| - |
85 |
| - while (size-- > 0) { |
86 |
| - NewNode temp = queue.remove(); |
87 |
| - map.computeIfAbsent(temp.level, k -> new ArrayList<>()).add(temp); |
88 |
| - |
89 |
| - maxLeft = Math.min(maxLeft, temp.level - 1); |
90 |
| - maxRight = Math.max(maxRight, temp.level + 1); |
91 |
| - |
92 |
| - if (temp.t.left != null) { |
93 |
| - queue.add(new NewNode(temp.t.left, temp.x - 1, temp.y - 1, temp.level - 1)); |
94 |
| - } |
95 |
| - |
96 |
| - if (temp.t.right != null) { |
97 |
| - queue.add(new NewNode(temp.t.right, temp.x + 1, temp.y - 1, temp.level + 1)); |
98 |
| - } |
99 |
| - } |
| 29 | + } |
| 30 | + } |
| 31 | + List<List<Integer>> list = new ArrayList<>(); |
| 32 | + for (Integer key : map.keySet()) { |
| 33 | + List<TreeLevel> temp = map.get(key); |
| 34 | + Collections.sort(temp, new Comparator<TreeLevel>(){ |
| 35 | + public int compare(TreeLevel t1, TreeLevel t2) { |
| 36 | + int c = t2.yLevel - t1.yLevel; |
| 37 | + if (c == 0) { |
| 38 | + c = t1.node.val - t2.node.val; |
| 39 | + } |
| 40 | + return c; |
100 | 41 | }
|
| 42 | + }); |
| 43 | + List<Integer> valTemp = new ArrayList<>(); |
| 44 | + for (TreeLevel t : temp) { |
| 45 | + valTemp.add(t.node.val); |
| 46 | + } |
| 47 | + list.add(valTemp); |
101 | 48 | }
|
| 49 | + return list; |
| 50 | + } |
| 51 | +} |
| 52 | + |
| 53 | +class TreeLevel { |
| 54 | + TreeNode node; |
| 55 | + int xLevel; |
| 56 | + int yLevel; |
| 57 | + |
| 58 | + public TreeLevel(TreeNode node, int xLevel, int yLevel) { |
| 59 | + this.node = node; |
| 60 | + this.xLevel = xLevel; |
| 61 | + this.yLevel = yLevel; |
| 62 | + } |
102 | 63 | }
|
0 commit comments