暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

987. Vertical Order Traversal of a Binary Tree二叉树的垂直顺序遍历

程序媛的梦想 2020-03-17
213

给一颗二叉树,将在同一竖线上的结点放一起返回。注意:如果两个结点有相同的位置,则按结点的值从小到大返回。

思路:DFS,并且用TreeMap可以排序。


时间复杂度:O(NlogN),空间复杂度:O(N)。

 1import java.util.ArrayList;
2import java.util.Collections;
3import java.util.List;
4import java.util.TreeMap;
5
6/**
7 * @author lxn
8 * @description 987. Vertical Order Traversal of a Binary Tree
9 * @create 2020-03-16 23:49
10 */

11public class Algorithm987 {
12    public static void main(String[] args) {
13        TreeNode root = new TreeNode(3);
14        root.left = new TreeNode(9);
15        root.right = new TreeNode(20);
16        root.right.left = new TreeNode(15);
17        root.right.right = new TreeNode(7);
18        List<List<Integer>> res = new Solution987().verticalTraversal(root);
19    }
20}
21
22class Solution987 {
23    public List<List<Integer>> verticalTraversal(TreeNode root) {
24        // key: 同一x坐标 value: 键是同一深度的, 值是相同位置的点的集合
25        TreeMap<Integer, TreeMap<Integer, List<Integer>>> map = new TreeMap<>();
26        helper(root, 00map);
27        List<List<Integer>> res = new ArrayList<>();
28        int index = 0;
29
30        for (TreeMap<Integer, List<Integer>> cols : map.values()){
31            res.add(new ArrayList<>());
32            for (List<Integer> rows : cols.values()){ // 相同位置的点,按结点值从小到大返回
33                Collections.sort(rows);
34                for (int val : rows) res.get(index).add(val);
35            }
36            index++;
37        }
38        return res;
39    }
40
41    public void helper(TreeNode root, int index, int depth, TreeMap<Integer, TreeMap<Integer, List<Integer>>> map){
42        if (root == null) return;
43        if (!map.containsKey(index)){ // 该竖直方向上没出现过
44            map.put(index, new TreeMap<>());
45        }
46        if (!map.get(index).containsKey(depth)){ // 该深度没出现过
47            map.get(index).put(depth, new ArrayList<>());
48        }
49        map.get(index).get(depth).add(root.val); // 找出(index, depth)位置上的点,插入结点值
50
51        helper(root.left, index - 1, depth + 1map); // 递归做结点
52        helper(root.right, index + 1, depth + 1map); // 递归右结点
53    }
54}

文章转载自程序媛的梦想,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论