Leetcode 987. Vertical Order Traversal of a Binary Tree
题目链接: Vertical Order Traversal of a Binary Tree
难度:Hard
题目大意:
将二叉树的位置映射为坐标,每个节点有一个坐标,可能存在两个节点的坐标相同。将二叉树节点的值按列输出。
思路:
参考高赞回答,按层遍历二叉树,用map来存储每个节点所在的列和节点的值。
代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<List<Integer>> verticalTraversal(TreeNode root) {
List<List<Integer>> res=new ArrayList<>();
if(root==null){
return res;
}
Map<Integer,List<Integer>> map=new TreeMap<>();//记录每一列节点的值,key为列,value为这一列所有节点的值构成的List
Queue<TreeNode> nodeQueue=new LinkedList<>();
Queue<Integer> columnQueue=new LinkedList<>();//存储节点所在的列值
nodeQueue.offer(root);
columnQueue.offer(0);
while(!nodeQueue.isEmpty()){
Map<Integer,List<Integer>> levelMap=new TreeMap<>();//记录这一层各个节点的列值
int size=nodeQueue.size();
for(int i=0;i<size;i++){//每次遍历一层的节点
TreeNode node=nodeQueue.poll();
int column=columnQueue.poll();
if(!levelMap.containsKey(column)){
levelMap.put(column,new ArrayList<Integer>());
}
levelMap.get(column).add(node.val);
if(node.left!=null){
nodeQueue.offer(node.left);
columnQueue.offer(column-1);
}
if(node.right!=null){
nodeQueue.offer(node.right);
columnQueue.offer(column+1);
}
}
for(int key:levelMap.keySet()){//把这一层的结果加到总的结果中去
if(!map.containsKey(key)){
map.put(key,new ArrayList<Integer>());
}
List<Integer> list=levelMap.get(key);
Collections.sort(list);//如果这一层中农同一列上有两个节点,排序
map.get(key).addAll(list);
}
}
for(int key:map.keySet()){//treeMap中的key是有序的
res.add(map.get(key));
}
return res;
}
}