# 0987. Vertical Order Traversal of a Binary Tree ###### tags: `Leetcode` `Hard` `Bloomberg` `BFS` `DFS` Link: https://leetcode.com/problems/vertical-order-traversal-of-a-binary-tree/ ## 思路 和[314. Binary Tree Vertical Order Traversal](https://hackmd.io/ED-7DCHkQByRQaHGr6ETWw)有点像,区别在于需不需要按node value大小排序 原本的想法是用Map<Integer, List<Pair<Integer, Integer>>收集每个col对应的treenode的val,以及他们对应的row number,如果一个新的pair加进来,它和上一个的row number一样,就给他们两个排序,但是忽略了一个问题是 **如果tree比较深的话,有可能同一个row number 同一个col number对应的TreeNode有好几个**,而不是两个,所以只能在收集好他们之后,把他们存进答案之前,给他们排序 ### 方法二 top voted方法 在层序遍历每层的时候建一个map,存col值和node value的对应,然后排序,因为这样产生的一个list里面一定是col值和row值都相等的node,之后再放到以col值为key的map里面,最后再用之前vertical order traversal的方法遍历即可 ## Code ### 方法一 ```java= class Solution { public List<List<Integer>> verticalTraversal(TreeNode root) { //node.val row Map<Integer, List<Pair<Integer, Integer>>> map = new HashMap<>(); Queue<Pair<TreeNode, Pair<Integer,Integer>>> q = new LinkedList<>(); int minCol = Integer.MAX_VALUE, maxCol = Integer.MIN_VALUE; q.add(new Pair<>(root, new Pair<Integer, Integer>(0,0))); while(!q.isEmpty()){ Pair<TreeNode, Pair<Integer, Integer>> curr = q.poll(); TreeNode currNode = curr.getKey(); int row = curr.getValue().getKey(); int col = curr.getValue().getValue(); if(!map.containsKey(col)){ map.put(col, new ArrayList<Pair<Integer, Integer>>()); } map.get(col).add(new Pair<>(currNode.val, row)); minCol = Math.min(minCol, col); maxCol = Math.max(maxCol, col); if(currNode.left!=null){ q.offer(new Pair(currNode.left, new Pair(row+1, col-1))); } if(currNode.right!=null){ q.offer(new Pair(currNode.right, new Pair(row+1, col+1))); } } List<List<Integer>> ans = new ArrayList<>(); for(int i = minCol; i <= maxCol;i++){ Collections.sort(map.get(i), new Comparator<Pair<Integer,Integer>>(){ public int compare(Pair<Integer, Integer> p1, Pair<Integer, Integer> p2){ if(p1.getValue().equals(p2.getValue())){ return p1.getKey()-p2.getKey(); } else{ return p1.getValue()-p2.getValue(); } } }); List<Integer> sorted = new ArrayList(); for(Pair<Integer, Integer> p:map.get(i)){ sorted.add(p.getKey()); } ans.add(sorted); } return ans; } } ``` ### 方法二 ```java= class Solution { public List<List<Integer>> verticalTraversal(TreeNode root) { Map<Integer, List<Integer>> colMap = new HashMap<>(); Queue<Pair<TreeNode,Integer>> q = new LinkedList<>(); q.add(new Pair<>(root,0)); int minCol = 0; int maxCol = 0; while(!q.isEmpty()){ int size = q.size(); Map<Integer, List<Integer>> tmpMap = new HashMap<>(); for(int i = 0;i < size;i++){ Pair<TreeNode, Integer> curr = q.poll(); TreeNode currNode = curr.getKey(); int col = curr.getValue(); minCol = Math.min(col, minCol); maxCol = Math.max(col, maxCol); if(!tmpMap.containsKey(col)) tmpMap.put(col, new ArrayList<>()); tmpMap.get(col).add(currNode.val); if(currNode.left!=null) q.add(new Pair<>(currNode.left, col-1)); if(currNode.right!=null) q.add(new Pair<>(currNode.right, col+1)); } for(int key:tmpMap.keySet()){ if(!colMap.containsKey(key)){ colMap.put(key, new ArrayList<>()); } List<Integer> temp = tmpMap.get(key); Collections.sort(temp); colMap.get(key).addAll(temp); } } List<List<Integer>> ans = new ArrayList<>(); for(int i = minCol;i <= maxCol;i++){ ans.add(colMap.get(i)); } return ans; } } ```