Binary Tree Vertical Order Traversal

  • 从题目特点入手,知道结果数组里第一个和最后一个数组,是树的最左端和最右端。要获得这两个点,必须通过DFS不断的向左或者向右移动。如果以root为原点坐标来看,左边的层数为负数(min),右边层数为正数。为了处理这个负数的问题,把坐标轴向右平移直到最左端层数为0。此时root的坐标恰好为(-min)
  • 接着只需要对每一层的点进行判断,加入到对应位置的list中。于是很自然想到BFS。注意这里需要用两个Queue来保存node和他的位置

另外发现其实可以直接根据(col, List)使用HashMap进行保存,依旧是下一层往左的话,col-1,往右col+1,在保存的过程中,来找到边界值。最后再根据map和边界值来构建答案

//DFS+BFS
int min = 0;
    int max = 0;
    public List<List<Integer>> verticalOrder(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        if (root == null) return res;

        helper(root, 0);

        for (int i = min; i<=max; i++)
            res.add(new ArrayList<>());

        Queue<TreeNode> queue = new LinkedList<>();
        Queue<Integer> index = new LinkedList<>();
        queue.add(root);
        index.add(-min);

        while (!queue.isEmpty()) {
            TreeNode cur = queue.poll();
            int idx = index.poll();
            res.get(idx).add(cur.val);

            if (cur.left != null) {
                queue.add(cur.left);
                index.add(idx-1);
            }
            if (cur.right != null) {
                queue.add(cur.right);
                index.add(idx+1);
            }            
        }

        return res;
    }

    private void helper(TreeNode root, int level) {
        if (root == null) return;

        min = Math.min(min, level);
        max = Math.max(max, level);

        helper(root.left, level-1);
        helper(root.right, level+1); 
    }

//only BFS
public List<List<Integer>> verticalOrder(TreeNode root) {
    List<List<Integer>> res = new ArrayList<>();
    if (root == null) {
        return res;
    }

    Map<Integer, ArrayList<Integer>> map = new HashMap<>();
    Queue<TreeNode> q = new LinkedList<>();
    Queue<Integer> cols = new LinkedList<>();

    q.add(root); 
    cols.add(0);

    int min = 0;
    int max = 0;

    while (!q.isEmpty()) {
        TreeNode node = q.poll();
        int col = cols.poll();

        if (!map.containsKey(col)) {
            map.put(col, new ArrayList<Integer>());
        }
        map.get(col).add(node.val);

        if (node.left != null) {
            q.add(node.left); 
            cols.add(col - 1);
            min = Math.min(min, col - 1);
        }

        if (node.right != null) {
            q.add(node.right);
            cols.add(col + 1);
            max = Math.max(max, col + 1);
        }
    }

    for (int i = min; i <= max; i++) {
        res.add(map.get(i));
    }

    return res;
}

results matching ""

    No results matching ""