所谓的垂直遍历。就是从左到右,从上到下。
采用BFS实现从上到下。
那么从左到右如何实现呢?
自定义MyNode记录偏移量,用TreeMap存储每个偏移量的列表,最终可以按顺序输出。
public class test {
List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> verticalOrder(TreeNode root){
if(root == null){
return res;
}
TreeMap<Integer, List<Integer>> map = new TreeMap<>();
Deque<MyNode> queue = new ArrayDeque<>();
queue.add(new MyNode(0,root));
while(!queue.isEmpty()){
int size = queue.size();
for(int i=0; i<size; i++){
MyNode curNode = queue.poll();
map.putIfAbsent(curNode.dic, new ArrayList<>());
map.get(curNode.dic).add(curNode.node.val);
if(curNode.node.left != null){
queue.addLast(new MyNode(curNode.dic-1, curNode.node.left));
}
if(curNode.node.right != null){
queue.addLast(new MyNode(curNode.dic+1, curNode.node.right));
}
}
}
for(Integer num : map.keySet()){
res.add(map.get(num));
}
return res;
}
}
class MyNode{
public int dic;
public TreeNode node;
public MyNode(int dic, TreeNode node){
this.dic = dic;
this.node = node;
}
}