314. Binary Tree Vertical Order Traversal
题目链接:https://leetcode.com/problems...
这道题要求vertical的order来保存结果,一开始想到的是用遍历的时候更新index,比如现在的index = 0,有左孩子的话就在最前面插入结果,且shift++。不过这样的话每个subproblem的时间是O(N)了。
那么可以先用hashmap来cache,遍历的时候就要根据node所在的column的index来存,根节点的index从0开始,左边的孩子index-1,右边的孩子index+1,遍历树结束之后可以把所有index已经对应的值保存下来。还需要遍历hashmap从而得到要求的结果,因为hashmap没有order,所以还需要保存下index的最小值和最大值,从而知道hashmap遍历的范围。第一遍tree的遍历可以bfs也可以dfs。
public class Solution {
public List<List<Integer>> verticalOrder(TreeNode root) {
// store the val according to their index in col
map = new HashMap();
List<List<Integer>> result = new ArrayList();
if(root == null) return result;
// traverse the tree
bfs(root);
// traverse map to get result
for(int i = low; i <= high; i++) {
if(map.containsKey(i)) {
result.add(map.get(i));
}
}
return result;
}
Map<Integer, List<Integer>> map;
int low = 0, high = 0;
private void bfs(TreeNode root) {
// bfs, use queue
Queue<TreeNode> q = new LinkedList();
Queue<Integer> index = new LinkedList();
q.offer(root);
index.offer(0);
while(!q.isEmpty()) {
TreeNode cur = q.poll();
int curIndex = index.poll();
// add node according to the column index
if(!map.containsKey(curIndex)) map.put(curIndex, new ArrayList());
map.get(curIndex).add(cur.val);
// update lowest index and highes index
low = Math.min(low, curIndex);
high = Math.max(high, curIndex);
if(cur.left != null) {
q.offer(cur.left);
index.offer(curIndex - 1);
}
if(cur.right != null) {
q.offer(cur.right);
index.offer(curIndex + 1);
}
}
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。