双非二本找工作前的准备day21

发布于:2024-05-06 ⋅ 阅读:(21) ⋅ 点赞:(0)

 学习目标:

每天复习代码随想录上的题目1-2道算法(时间充足可以继续)

今日碎碎念:

1)今天开始是二叉树系列

2)出租屋里不知道干啥,看看书啊刷刷算法,打打游戏,学学技术啥的,不让自己太闲着才行。

3)天天都是吃外卖,不出门了都,后续等到9号回来之后继续开始整理八股(以复习为主)。


力扣刷题

算法

力扣515:515. 在每个树行中找最大值

class Solution {
    //结果集
    public List<List<Integer>> res = new ArrayList<List<Integer>>();

    public List<List<Integer>> levelOrder(TreeNode root) {
        dfs(root,0);
        return res;
    }
    //dfs方式
    public void dfs(TreeNode node,Integer deep){
        if(node == null) return;
        //记录深度
        deep++;
        //开始将遍历到的层加入大结果集
        if(res.size() < deep){
            //解读该if代码块:如果走到下一层了,我们就需要new一个新的List
            List<Integer> item = new ArrayList<>();
            //将新一层的小结果集放入大结果集
            res.add(item);
        }
        //开始dfs:通过deep找到对应层级的小结果集来存入遍历到的节点
        res.get(deep-1).add(node.val);

        dfs(node.left,deep);
        dfs(node.right,deep);
    }
}

力扣116:116. 填充每个节点的下一个右侧节点指针

1)解答思路:这道题需要我们特殊处理一下根节点,因为根节点是没有右边兄弟节点的

2)同理,每一层的最后一个节点也是一样没有右边兄弟节点的,想明白这两个点,然后再去bfs遍历

/*
// Definition for a Node.
class Node {
    public int val;
    public Node left;
    public Node right;
    public Node next;

    public Node() {}
    
    public Node(int _val) {
        val = _val;
    }

    public Node(int _val, Node _left, Node _right, Node _next) {
        val = _val;
        left = _left;
        right = _right;
        next = _next;
    }
};
*/

class Solution {
    public Node connect(Node root) {
        Deque<Node> que = new LinkedList<>();
        if(root != null) que.offer(root);
        //bfs
        while(!que.isEmpty()){
            //记录当前大小
            int size = que.size();
            //除了根节点没有兄弟节点以外,其余的都有,因此先对根节点特殊处理
            Node cur = que.poll();
            if(cur.left!=null) que.offer(cur.left);
            if(cur.right!=null) que.offer(cur.right);
            //然后去处理所有的子节点
            for(int i = 1;i<size;i++){
                Node tmp = que.poll();
                if(tmp.left!=null) que.offer(tmp.left);
                if(tmp.right!=null) que.offer(tmp.right);
                //记录上一个节点,然后指向右边
                cur.next = tmp;
                cur = tmp;
            }
        }
        return root;
    }
}

力扣104:104. 二叉树的最大深度

解答思路:

        1)注意,这里并不需要对每个节点去找从该节点出发的最深,因为bfs的性质,只要队列中还有,还能往下,deep直接增加即可,如果是dfs,就会麻烦一点。

class Solution {
    public int maxDepth(TreeNode root) {
        if(root == null) return 0;
        int deep = 0;
        Deque<TreeNode> que = new LinkedList<>();
        que.offer(root);
        while(!que.isEmpty()){
            int size = que.size();
            deep++;
            for(int i = 0;i < size;i++){
                //拿出当前节点
                TreeNode tmp = que.poll();
                //找孩子
                if(tmp.left!=null) que.offer(tmp.left);
                if(tmp.right!=null) que.offer(tmp.right);
            }
        }
        return deep;
    }
}

 力扣111:111. 二叉树的最小深度

解答思路:

        1)这道题思路同上,bfs直接做,当,当前节点的左右孩子为空,就可以返回答案了,如果存在孩子,还能继续往下走。

class Solution {
    public int minDepth(TreeNode root) {
        if(root == null) return 0;
        int deep = 0;
        Deque<TreeNode> que = new LinkedList<>();
        que.offer(root);
        while(!que.isEmpty()){
            int size = que.size();
            //bfs性质,队列没空就可以继续
            deep++;
            for(int i = 0;i<size;i++){
                TreeNode tmp = que.poll();
                //当左右孩子都为空的时候才可以返回答案
                if(tmp.left==null && tmp.right==null) return deep;
                if(tmp.left!=null) que.offer(tmp.left);
                if(tmp.right!=null) que.offer(tmp.right);
            }
        }
        return deep;
    }
}