Leetcode 987. Vertical Order Traversal of a Binary Tree(层级遍历)

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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值