算法练习(树)

1.在这里插入图片描述

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;
      }
    }

    public int kthSmallest(TreeNode root, int k) {
    
    
        LinkedList<TreeNode> linkedList = new LinkedList<>();
        while (true){
    
    
            while (root != null){
    
    
                linkedList.add(root);
                root = root.left;
            }
            root = linkedList.removeLast();
            k--;
            if (k==0){
    
    
                return root.val;
            }
            root = root.right;
        }
    }

2.在这里插入图片描述

    HashMap<Integer,TreeNode> parentMap =  new HashMap<>();//存储父节点
    HashSet<Integer> visitedSet = new HashSet<>();//储存p的父节点

    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
    
    
           if (p == root || q == root){
    
    
               return root;
           }

           dfs(root);
           while (p != null){
    
    
               visitedSet.add(p.val);
               p = parentMap.get(p.val);
           }
           while (q != null){
    
    
               if (visitedSet.contains(q.val)){
    
    
                   return q;
               }
               q = parentMap.get(q.val);
           }
           return null;
    }

    private void dfs(TreeNode root){
    
    
        if (root.left != null){
    
    
            parentMap.put(root.left.val,root);
            dfs(root.left);
        }

        if (root.right != null){
    
    
            parentMap.put(root.right.val,root);
            dfs(root.right);
        }
    }

3.在这里插入图片描述
在这里插入图片描述

 class Codec {
    
    

        public StringBuilder serializeDfs(TreeNode root , StringBuilder str){
    
    
            if (root == null){
    
    
                str.append("null,");
            }else {
    
    
                str.append(root.val+",");
                serializeDfs(root.left, str);
                serializeDfs(root.right, str);
            }
            return str;
        }

        public String serialize(TreeNode root) {
    
    
            StringBuilder sb = new StringBuilder();
            sb = serializeDfs(root, sb);
            return sb.toString();
        }

        public TreeNode deserializeDfs(List<String> dataList){
    
    
            if (dataList.get(0).equals("null")){
    
    
                dataList.remove(0);
                return null;
            }

            TreeNode root = new TreeNode(Integer.valueOf(dataList.get(0)));
            dataList.remove(0);
            root.left = deserializeDfs(dataList);
            root.right = deserializeDfs(dataList);

            return root;
        }

        public TreeNode deserialize(String data) {
    
    
            String[] strings = data.split(",");
            List<String> dataList = new LinkedList<String>(Arrays.asList(strings));
            return deserializeDfs(dataList);
        }

    }

4.在这里插入图片描述
在这里插入图片描述

//思路:只考虑每个 building 的左上角和右上角坐标,将所有点按 x 坐标排序,然后开始遍历。

//需要一个优先队列来存储遍历坐标的高度,也就是 y 轴坐标。

//对于左上角坐标和右上角坐标有不同的处理方式。

//遇到左上角坐标,将其 y 坐标加入到优先队列中。

//遇到右上角坐标,将其 y 坐标从优先队列中删除,也就是删除了其对应的左上角坐标的 y 值。

//最后判断优先队列中的最高高度相对于之前是否更新,如果更新了的话,就将当前的 x 以及更新后的最高高度作为一个坐标加入到最终结果中。

public List<List<Integer>> getSkyline(int[][] buildings) {
    
    
        List<List<Integer>> points = new ArrayList<>();
        List<List<Integer>> results = new ArrayList<>();
        int n = buildings.length;
        //求出将左上角和右上角坐标, 左上角坐标的 y 存负数
        for (int[] b : buildings) {
    
    
            List<Integer> p1 = new ArrayList<>();
            p1.add(b[0]);
            p1.add(-b[2]);
            points.add(p1);

            List<Integer> p2 = new ArrayList<>();
            p2.add(b[1]);
            p2.add(b[2]);
            points.add(p2);
        }
        //将所有坐标排序
        Collections.sort(points, new Comparator<List<Integer>>() {
    
    
            @Override
            public int compare(List<Integer> p1, List<Integer> p2) {
    
    
                int x1 = p1.get(0);
                int y1 = p1.get(1);
                int x2 = p2.get(0);
                int y2 = p2.get(1);
                if (x1 != x2) {
    
    
                    return x1 - x2;
                } else {
    
    
                    return y1 - y2;
                }
            }

        });
        TreeMap<Integer, Integer> treeMap = new TreeMap<>(new Comparator<Integer>() {
    
    
            @Override
            public int compare(Integer i1, Integer i2) {
    
    
                return i2 - i1;
            }
        });
        treeMap.put(0, 1);
        int preMax = 0;

        for (List<Integer> p : points) {
    
    
            int x = p.get(0);
            int y = p.get(1);
            if (y < 0) {
    
    
                Integer v = treeMap.get(-y);
                if (v == null) {
    
    
                    treeMap.put(-y, 1);
                } else {
    
    
                    treeMap.put(-y, v + 1);
                }
            } else {
    
    
                Integer v = treeMap.get(y);
                if (v == 1) {
    
    
                    treeMap.remove(y);
                } else {
    
    
                    treeMap.put(y, v - 1);
                }
            }
            int curMax = treeMap.firstKey();
            if (curMax != preMax) {
    
    
                List<Integer> temp = new ArrayList<>();
                temp.add(x);
                temp.add(curMax);
                results.add(temp);
                preMax = curMax;
            }
        }
        return results;
    }

猜你喜欢

转载自blog.csdn.net/cy1798/article/details/114398606