Vertical Order Traversal of a Binary Tree

class Solution {
    static class Pair implements Comparable<Pair> {
        int val;
        int pos;
        public Pair(int val, int pos) {
            this.val = val;
            this.pos = pos;
        }
        
        @Override
        public int compareTo(Pair o) {
            int compare = Integer.compare(o.pos, pos);
            if (compare != 0) {
                return compare;
            }
            return Integer.compare(val, o.val);
        }
    }
    
    Map<Integer, PriorityQueue<Pair>> map;
    int min;
    int max;
    public List<List<Integer>> verticalTraversal(TreeNode root) {
        map = new HashMap<>();
        min = Integer.MAX_VALUE;
        max = Integer.MIN_VALUE;
        helper(root, 0, 0);
        List<List<Integer>> result = new ArrayList<>(max - min);
        for (int i = min; i <= max; i++) {
            PriorityQueue<Pair> pq = map.get(i);
            List<Integer> list = new ArrayList<>(pq.size());
            while (!pq.isEmpty()) {
                list.add(pq.poll().val);
            }
            result.add(list);
        }
        return result;
    }
    
    private void helper(TreeNode node, int verticalLevel, int horizontalLevel) {
        if (node == null) {
            return;
        }
        min = Math.min(min, verticalLevel);
        max = Math.max(max, verticalLevel);
        map.computeIfAbsent(verticalLevel, k -> new PriorityQueue<>()).offer(new Pair(node.val, horizontalLevel));
        helper(node.left, verticalLevel - 1, horizontalLevel - 1);
        helper(node.right, verticalLevel + 1, horizontalLevel - 1);
    }
}

最后更新于

这有帮助吗?