987. 二叉树的垂序遍历

987. 二叉树的垂序遍历

题目

题解

  1. 首先,先采用层序遍历的方式,遍历整个树节点。在遍历的过程中,计算好每个节点的行、列下标。
  2. 维护一个Map<Integer /*列号*/, List<int[] /*{行号,值}*/> /*每列的值列表*/> map
  3. 遍历到每一个节点时,将这个节点添加到map中对应的列里,以new int[]{行号, 值}的形式
  4. 遍历结束后,将map按照key从大到小的顺序进行遍历,对map中每一个value列表,进行排序
    1. 如果行号不同,则行号小的排在前面
    2. 如果行号相同,则值小的排在前面
class Solution {
    public List<List<Integer>> verticalTraversal(TreeNode root) {
        if (root == null) {
            return new ArrayList<>();
        }

        Map<Integer /*列*/, List<int[]> /* 行, val */> map = new HashMap<>();
        Deque<MyTreeNode> queue = new ArrayDeque<>();
        queue.offer(new MyTreeNode(root, 0, 0));

        while (!queue.isEmpty()) {
            MyTreeNode curr = queue.poll();
            /*
            将当前节点添加到对应列的列表中,格式为
            [行号, 当前节点值]
             */
            map.computeIfAbsent(curr.col, k -> new ArrayList<>())
                    .add(new int[]{curr.row, curr.treeNode.val});
            if (curr.treeNode.right != null) {
                queue.offer(new MyTreeNode(curr.treeNode.right, curr.row + 1, curr.col + 1));
            }
            if (curr.treeNode.left != null) {
                queue.offer(new MyTreeNode(curr.treeNode.left, curr.row + 1, curr.col - 1));
            }
        }
        int minCol = 0;
        int maxCol = 0;
        for (Integer col : map.keySet()) {
            minCol = Math.min(minCol, col);
            maxCol = Math.max(maxCol, col);
        }
        List<List<Integer>> result = new ArrayList<>();
        for (int i = minCol; i <= maxCol; i++) {
            List<int[]> list = map.get(i);
            list.sort((node1, node2) -> { // 自定义比较器,进行值的比较
                if (node1[0] != node2[0]) {
                    // 不同行号,行号小的排在前面
                    return node1[0] - node2[0];
                } else {
                    // 同行号,值小的排在前面
                    return node1[1] - node2[1];
                }
            });
            List<Integer> values = new ArrayList<>();
            for (int[] node : list) {
                values.add(node[1]);
            }
            result.add(values);
        }
        return result;
    }

    class MyTreeNode {
        TreeNode treeNode;
        int row;
        int col;

        public MyTreeNode(TreeNode treeNode, int row, int col) {
            this.treeNode = treeNode;
            this.row = row;
            this.col = col;
        }
    }
}

 

posted @ 2023-07-01 00:54  w一蓑烟雨任平生w  阅读(34)  评论(0)    收藏  举报