代码随想录算法训练营第十五天| 二叉树的层序遍历、226.翻转二叉树、101.对称二叉树

系列文章目录


目录

  • 系列文章目录
  • 二叉树层序遍历(10题)
    • 102. 二叉树的层序遍历
      • ①DFS--递归方式
      • ②BFS--迭代方式--借助队列
    • 107.二叉树的层次遍历 II
    • 199.二叉树的右视图
    • 637.二叉树的层平均值
    • 429.N叉树的层序遍历
      • 遍历每个节点的子节点
    • 515.在每个树行中找最大值
    • 116.填充每个节点的下一个右侧节点指针
    • 117.填充每个节点的下一个右侧节点指针II
    • 104.二叉树的最大深度
    • 111.二叉树的最小深度
  • 226.翻转二叉树
    • ①BFS层序遍历(广度优先遍历)
    • ②中序统一迭代遍历(模拟深度优先遍历,前中后都可)
    • ③DFS递归遍历(深度优先遍历,前序后序都可)
      • 中序不行原因
      • 前序(中节点需要交换左右子节点顺序,左右代表遍历方向)
      • 后序
  • 101. 对称二叉树


二叉树层序遍历(10题)

102. 二叉树的层序遍历

①DFS–递归方式

  • 递归遍历:一直访问到最深的节点,然后回溯到它的父节点,遍历另一条路径,直到遍历完所有节点,对应DFS(深度优先搜索),利用递归/栈实现。
  • DFS(Depth-First Search,深度优先搜索):
    ①在 DFS 中,我们从起始节点开始,沿着一条路径一直往下搜索,直到无法继续为止。然后回溯到上一个节点,尝试探索其他路径。
    ②这意味着在遍历过程中,我们会尽可能地深入到图的一个分支中,直到到达末端节点,然后再返回并尝试其他分支。
    ③通常使用递归或栈来实现 DFS。
import java.util.LinkedList;
import java.util.List;

/**
 * Definition for a binary tree node.
 * public 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;
 * }
 * }
 */
class Solution {
    //类的属性可以被该类所有方法调用
    List<List<Integer>> resList = new LinkedList<>();//返回遍历结果
    public List<List<Integer>> levelOrder(TreeNode root) {
        checkFun01(root,0);
        return resList;
    }
    //DFS--递归方式
    public void checkFun01(TreeNode node,int deep){//确定递归函数的参数和返回值
        //确定终止条件
        if(node==null){
            return;
        }
        deep++;

        //确定单层递归的逻辑
            //当层级增加时,list的Item也增加,利用list的索引值进行层级界定
        if(resList.size()<deep){
            List<Integer> itemList = new LinkedList<>();//存放每一层的元素
            resList.add(itemList);
        }
        resList.get(deep-1).add(node.val);
        checkFun01(node.left,deep);
        checkFun01(node.right,deep);
    }
}

②BFS–迭代方式–借助队列

层序遍历:从上到下,从左到右,访问所有节点,对应BFS(广度优先搜索),利用队列实现。
BFS(Breadth-First Search,广度优先搜索):
①在 BFS 中,我们从起始节点开始,首先访问起始节点,然后逐层地访问与起始节点相邻的节点。
②换句话说,BFS 会先遍历图的第一层节点,然后是第二层节点,以此类推,直到遍历完整个图。
③通常使用队列来实现 BFS。

①最后返回的链表resList 需作为类的属性,因其需被该类的所有访问。
②借助队列que实现遍历元素,当队列不为空(!que.isEmpty())时说明节点还没有遍历完;
③在每一层遍历的时候,一定要使用固定大小的len,不要使用que.size(),因为que.size是不断变化的。(除了要将自己的值弹出来加入链表itemList 中,还要将自己的左右孩子放进队列que中,作为下一层遍历。)
③将每一层的元素放在一个链表itemList 里面,最后将每一层的itemList 加入到最终要返回的链表resList里面。

import java.util.LinkedList;
import java.util.List;
/**
 * Definition for a binary tree node.
 * public 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;
 * }
 * }
 */
class Solution {
    //类的属性可以被该类所有方法调用
    List<List<Integer>> resList = new LinkedList<>();//返回遍历结果
    public List<List<Integer>> levelOrder(TreeNode root) {
        checkFun02(root);
        return resList;
    }

    //BFS--迭代方式--借助队列
    public void checkFun02(TreeNode root) {
        Queue<TreeNode> que = new LinkedList<>();

        //剪枝
        if (root == null) {
            return;
        }
        que.offer(root);
        while(!que.isEmpty()){//队列不为空说明还没遍历完
            List<Integer> itemList = new LinkedList<>();//存放每一层的元素
            int len = que.size();
            //将每一层的元素存入该层的链表
            while(len-->0){// 这里一定要使用固定大小size,不要使用que.size(),因为que.size是不断变化的
                TreeNode node = que.poll();
                itemList.add(node.val);
                if(node.left!=null){
                    que.offer(node.left);
                } if(node.right!=null){
                    que.offer(node.right);
                }
            }
            resList.add(itemList);//将该层列表元素加入最终要返回的链表
        }
    }
}

107.二叉树的层次遍历 II

相对于 102.二叉树的层序遍历,就是最后把resList链表反转一下就可以了。
①使用Collections类的reverse方法直接反转。
②/利用链表LinkedList可以通过addFirst方法进行 O(1) 头部插入, 这样最后答案不需要再反转。因该方法是继承的接口Deque<>,故在定义要返回的链表resList 时不能再用 List<List<Integer>>,而应该用LinkedList<List<Integer>>,最后在将每一层元素加入链表resList 是要用addFirst即可。

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

/**
 * Definition for a binary tree node.
 * public 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;
 * }
 * }
 */
class Solution {
    //①
    List<List<Integer>> resList = new LinkedList<>();
    //②
    //LinkedList<List<Integer>> resList = new LinkedList<>();

    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        bfsMethod(root);
        //①
        Collections.reverse(resList);
        return resList;
    }

    //BFS 借助队列迭代法
    public void bfsMethod(TreeNode node) {
        Deque<TreeNode> que = new ArrayDeque<>();
        //剪枝
        if (node == null) {
            return;
        }
        que.offer(node);
        while (!que.isEmpty()) {
            List<Integer> itemList = new LinkedList<>();
            int len = que.size();
            while (len-- > 0) {
                TreeNode tempNode = que.poll();
                itemList.add(tempNode.val);
                if (tempNode.left != null) {
                    que.offer(tempNode.left);
                }
                if (tempNode.right != null) {
                    que.offer(tempNode.right);
                }
            }
            //①
            resList.add(itemList);
            //②
            //resList.addFirst(itemList);
        }
    }
}

199.二叉树的右视图

注:当左子树比右子树长时,最右边的节点是左子树的右节点,故层序遍历也要加入左子树,不能只加入右子树,每次返回每层的最后一个字段即可

import java.util.LinkedList;

/**
 * Definition for a binary tree node.
 * public 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;
 * }
 * }
 */
class Solution {
    public List<Integer> rightSideView(TreeNode root) {
        List<Integer> resList = new LinkedList<>();
        //BFS 使用队列迭代
        Queue<TreeNode> que = new LinkedList<>();
        if (root == null) {
            return resList;
        }
        que.offer(root);
        while (!que.isEmpty()) {
            int len = que.size();
            while (len-- > 0) {//先比较再自减
                TreeNode node = que.poll();
                if (node.left != null) {
                    que.offer(node.left);//必须也加入左节点,因也可能看见左节点的右子节点
                }
                if (node.right != null) {
                    que.offer(node.right);
                }
                //当遍历到最右边的元素时,len已经自减为0
                if (len == 0) {
                    resList.add(node.val);//只添加最右边的节点
                }
            }

            //for循环
/*            for (int i = 0; i < len; i++) {
                TreeNode node = que.poll();
                if (node.left != null) {
                    que.offer(node.left);
                }
                if (node.right != null) {
                    que.offer(node.right);
                }
                if (i == len - 1) {//加入最右边的节点
                    resList.add(node.val);
                }
            }*/
        }

        return resList;
    }
}

637.二叉树的层平均值

思路:将每一层的值加起来,最后除以每一层的元素个数,将这个值加入到返回链表resList 即可。

import java.util.LinkedList;
import java.util.Queue;

/**
 * Definition for a binary tree node.
 * public 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;
 * }
 * }
 */
class Solution {
    List<Double> resList = new LinkedList<>();

    public List<Double> averageOfLevels(TreeNode root) {
        bfsMethod(root);
        return resList;
    }

    public void bfsMethod(TreeNode node) {
        Queue<TreeNode> que = new LinkedList<>();
        if (node == null) {
            return;
        }
        que.offer(node);
        while (!que.isEmpty()) {
            Double sum = 0.0;
            int len = que.size();
            for (int i = 0; i < len; i++) {
                TreeNode tempNode = que.poll();
                sum += tempNode.val;
                if (tempNode.left != null) que.offer(tempNode.left);
                if (tempNode.right != null) que.offer(tempNode.right);
            }
            resList.add(sum / len);
        }
    }
}

429.N叉树的层序遍历

import java.util.LinkedList;

class Solution {
    List<List<Integer>> resList = new LinkedList<>();

    public List<List<Integer>> levelOrder(Node root) {
        bfsMethod(root);
        return resList;
    }

    public void bfsMethod(Node node) {
        Queue<Node> que = new LinkedList<>();
        if (node == null) {
            return;
        }
        que.offer(node);
        while (!que.isEmpty()) {
            List<Integer> itemList = new LinkedList<>();
            int len = que.size();
            for (int i = 0; i < len; i++) {
                Node tempNode = que.poll();
                itemList.add(tempNode.val);
                List<Node> children = tempNode.children;
/*                while (!children.isEmpty()) {
                    que.offer(children.remove(0));
                }*/
                //增强for循环,代码健壮性及剪枝处理
                if(children==null||children.size()==0){
                    continue;
                }
                for(Node child:children){
                    que.offer(child);
                }
                //普通for循环(先判断children不为空才能调用方法,否则会空指针异常)
/*                for (int j = 0; children != null && j < children.size(); j++) {
                    que.offer(children.get(j));
                }*/
            }
            resList.add(itemList);
        }
    }
}

遍历每个节点的子节点

  1. 通过while 判断每个节点的子节点链表children是否为空,不为空时,将子节点链表children第一个元素移除并将其加入队列que中。

                    List<Node> children = tempNode.children;
                    while (!children.isEmpty()) {
                        que.offer(children.remove(0));
                    }
    
  2. 通过增强for循环来遍历子节点链表children的每个节点,并将其加入队列que中。

                    List<Node> children = tempNode.children;
                    //代码健壮性及剪枝处理
                    if(children==null||children.size()==0){
                        continue;
                    }
                    for(Node child:children){
                        que.offer(child);
                    }
    

    3.普通for循环(先判断children不为null才能调用方法,否则会报空指针异常)

    	            List<Node> children = tempNode.children;
                    for (int j = 0; children != null && j < children.size(); j++) {
                        que.offer(children.get(j));
                    }
    

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

注:找最大值时,可使用:
①三元运算符:maxNum = maxNum < tempNode.val ? tempNode.val : maxNum;
Math类的max方法:maxNum=Math.max(maxNum,tempNode.val);

import java.util.LinkedList;

/**
 * Definition for a binary tree node.
 * public 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;
 * }
 * }
 */
class Solution {
    List<Integer> resList = new LinkedList<>();

    public List<Integer> largestValues(TreeNode root) {
        dfsMethod(root);
        return resList;
    }

    public void dfsMethod(TreeNode node) {
        Queue<TreeNode> que = new LinkedList<>();
        if (node == null) {
            return;
        }
        que.offer(node);
        while (!que.isEmpty()) {
            int len = que.size();
            int maxNum = Integer.MIN_VALUE;
            while (len-- > 0) {
                TreeNode tempNode = que.poll();
                //maxNum = maxNum < tempNode.val ? tempNode.val : maxNum;
                maxNum=Math.max(maxNum,tempNode.val);
                if (tempNode.left != null) que.offer(tempNode.left);
                if (tempNode.right != null) que.offer(tempNode.right);
            }
            resList.add(maxNum);
        }
    }
}

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

指向下一个节点方法:

  1. 当前节点弹出后,它的next节点就是队列中的第一个元素,使用peek()即可查看下一个节点,注意处理每一层的最后一个节点即可。

                for (int i = 0; i < len; i++) {
            	...
                    if (i < len - 1) {
                        tempNode.next = que.peek();
                    } else {
                        tempNode.next = null;//最后一个节点让它指向null
                    }
                    ...
                }
    
  2. 为每一层最左边的节点虚构一个前节点即可在循环中将除最后一个节点的next填充,在循环外处理最后一个节点的next指针的指向即可。

           while (!que.isEmpty()) {
           		...
                Node pre = new Node();// 为每一层最左边的节点虚构一个前节点
    
                for (int i = 0; i < len; i++) {
                	...
                    pre.next = tempNode; // 让左边的节点指向当前节点
                    pre = tempNode; // 当前节点指定为下一个节点的左边节点
                    ...
                }
                pre.next = null;//tempNode.next = null; // 让当前层的最后一个节点指向null
            }
    
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

class Solution {
    public Node connect(Node root) {
        Queue<Node> que = new LinkedList<>();
        if (root == null) {
            return null;
        }
        que.offer(root);
        while (!que.isEmpty()) {
            int len = que.size();
            Node pre = new Node();// 为每一层最左边的节点虚构一个前节点

            for (int i = 0; i < len; i++) {
                Node tempNode = que.poll();
                /*if (i < len - 1) {
                    tempNode.next = que.peek();
                } else {
                    //最后一个节点让它指向null
                    tempNode.next = null;
                }*/
                pre.next = tempNode; // 让左边的节点指向当前节点
                pre = tempNode; // 当前节点指定为下一个节点的左边节点
                if (tempNode.left != null) que.offer(tempNode.left);
                if (tempNode.right != null) que.offer(tempNode.right);
            }
            pre.next = null;//tempNode.next = null; // 让当前层的最后一个节点指向null
        }
        return root;
    }
}

117.填充每个节点的下一个右侧节点指针II

这道题目说是二叉树,但 116题目 说是完整二叉树,其实没有任何差别,一样的代码一样的逻辑一样的味道。(使用了虚拟左节点)

import java.util.Queue;

class Solution {
    public Node connect(Node root) {
        Queue<Node> que = new LinkedList<>();
        if (root == null) {
            return null;
        }
        que.offer(root);
        while (!que.isEmpty()) {
            int len = que.size();
            Node pre=new Node();// 为每一层最左边的节点虚构一个前节点

            for (int i = 0; i < len; i++) {
                Node tempNode = que.poll();
                pre.next=tempNode;// 让左边的节点指向当前节点
                pre=tempNode;// 当前节点指定为下一个节点的左边节点
                if(tempNode.left!=null)que.offer(tempNode.left);
                if(tempNode.right!=null)que.offer(tempNode.right);
            }
            pre.next=null;// 让当前层的最后一个节点指向null
        }
        return root;
    }
}

104.二叉树的最大深度

使用迭代法的话,使用层序遍历是最为合适的,因为最大的深度就是二叉树的层数,和层序遍历的方式极其吻合。在二叉树中,一层一层的来遍历二叉树,记录一下遍历的层数就是二叉树的深度。

import java.util.LinkedList;

/**
 * Definition for a binary tree node.
 * public 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;
 * }
 * }
 */
class Solution {
    public int maxDepth(TreeNode root) {
        Queue<TreeNode> que = new LinkedList<>();
        if (root == null) {
            return 0;
        }
        que.offer(root);
        int deep = 0;
        while (!que.isEmpty()) {
            int len = que.size();
            deep++;// 记录深度
            while (len-- > 0) {
                TreeNode tempNode = que.poll();
                if(tempNode.left!=null)que.offer(tempNode.left);
                if(tempNode.right!=null)que.offer(tempNode.right);
            }
        }
        return deep;
    }
}

111.二叉树的最小深度

相对于 104.二叉树的最大深度 ,本题还也可以使用层序遍历的方式来解决,思路是一样的。
需要注意的是,只有当左右孩子都为空的时候,才说明遍历的最低点了。如果其中一个孩子为空则不是最低点。

import java.util.LinkedList;
import java.util.Queue;

/**
 * Definition for a binary tree node.
 * public 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;
 * }
 * }
 */
class Solution {
    public int minDepth(TreeNode root) {
        Queue<TreeNode> que = new LinkedList<>();
        if (root == null) {
            return 0;
        }
        que.offer(root);
        int deep = 0;
        while (!que.isEmpty()) {
            int len = que.size();
            deep++;
            while (len-- > 0) {
                TreeNode tempNode = que.poll();
                //如果当前节点的左右孩子都为空,直接返回最小深度
                if (tempNode.left == null && tempNode.right == null) {
                   return deep;
                }
                if (tempNode.left != null) que.offer(tempNode.left);
                if (tempNode.right != null) que.offer(tempNode.right);
            }
        }
        return deep;
    }
}

226.翻转二叉树

①BFS层序遍历(广度优先遍历)

在遍历过程中交换左右节点。

import java.util.LinkedList;

/**
 * Definition for a binary tree node.
 * public 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;
 *     }
 * }
 */
class Solution {
    public TreeNode invertTree(TreeNode root) {
        //层序遍历,在遍历过程中交换左右节点
        LinkedList<TreeNode> que=new LinkedList<TreeNode>();
        if(root==null){
            return null;
        }
        que.offer(root);
        while (!que.isEmpty()){
            int len = que.size();

            while(len-->0){
                TreeNode cur=que.poll();

                //交换左右节点
                TreeNode tempNode=cur.left;
                cur.left=cur.right;
                cur.right=tempNode;

                if(cur.left!=null){
                    que.offer(cur.left);
                }
                if(cur.right!=null){
                    que.offer(cur.right);
                }
            }
        }
        return root;
    }
}

②中序统一迭代遍历(模拟深度优先遍历,前中后都可)

递归法中序不行,但统一迭代遍历的中序可以,因为这是用栈来遍历,而不是靠指针来遍历,避免了递归法中翻转了两次的情况。

import java.util.LinkedList;
class Solution {
    public TreeNode invertTree(TreeNode root) {
        //中序迭代遍历
        LinkedList<TreeNode> stack = new LinkedList<>();
        if (root == null) {
            return null;
        }
        stack.push(root);
        while (!stack.isEmpty()) {
            TreeNode node = stack.peek();
            if (node != null) {
                stack.pop();
                //(1)在压入栈之前就交换当前节点的左右子节点
                TreeNode tempNode = node.left;
                node.left = node.right;
                node.right = tempNode;
                if (node.right != null) stack.push(node.right);
                stack.push(node);
                stack.push(null);
                if (node.left != null) stack.push(node.left);
            } else {
                stack.pop();//弹出空指针
                stack.pop();//重新取出栈中元素
                //(2)节点处理逻辑 交换当前节点的左右子节点
                /*TreeNode tempNode = node.left;
                node.left = node.right;
                node.right = tempNode;*/
            }
        }
        return root;
    }
}

③DFS递归遍历(深度优先遍历,前序后序都可)

中序不行原因

前后序遍历都可以。中序不行,因为先左孩子交换孩子,再根交换孩子(做完后,右孩子已经变成了原来的左孩子),再右孩子交换孩子(此时其实是对原来的左孩子做交换)。
在这里插入图片描述
如果非要使用递归中序的方式写,也可以,如下代码就可以避免节点左右孩子翻转两次的情况:

//确定单层递归逻辑
        inorder(node.left);// 左
        TreeNode tempNode = node.left;// 中
        node.left = node.right;
        node.right = tempNode;
        inorder(node.left);// 注意 这里依然要遍历左孩子,因为中间节点已经翻转了

代码虽然可以,但这毕竟不是真正的递归中序遍历了。

前序(中节点需要交换左右子节点顺序,左右代表遍历方向)

//确定单层递归逻辑
        TreeNode tempNode = node.left;
        node.left = node.right;
        node.right = tempNode;
        preOrder(node.left);
        preOrder(node.right);

后序

//确定单层递归逻辑
        postorder(node.left);
        postorder(node.right);
        TreeNode tempNode = node.left;
        node.left = node.right;
        node.right = tempNode;
class Solution {
    public TreeNode invertTree(TreeNode root) {
        //DFS 递归前序遍历
        preOrder(root);
        return root;
    }

    public void preOrder(TreeNode node) {//确定递归参数和返回值
        //终止条件
        if (node == null) {
            return;
        }
        //确定单层递归逻辑
        TreeNode tempNode = node.left;
        node.left = node.right;
        node.right = tempNode;
        preOrder(node.left);
        preOrder(node.right);
    }
}

101. 对称二叉树

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/486203.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ftrans安全数据摆渡系统 构建便捷的内外网数据交换通道

安全数据摆渡系统是一种设计用于解决内外网环境下&#xff0c;数据传输、管理、共享问题的安全系统&#xff0c;通过加密、访问控制等策略&#xff0c;提供安全可靠的数据传输和共享服务&#xff0c;尤其适用于对网络安全建设要求高的行业&#xff0c;比如研发型企业、党政机构…

构建vue3项目以及bem架构

构建vue3vite项目 &#xff08;1&#xff09;使用vite初始化一个项目 npm init vitelatest &#xff08;2&#xff09;构建cli项目 vue create <project> bem架构 src下新建文件bem.scss $namespace: "xc" !default; $block-sel: "-" !defaul…

【LVGL-开关部件】

LVGL-开关部件 ■ LVGL-开关部件■ 开关部件&#xff1a;指示器打开的颜色■ 开关部件&#xff1a;不可修改■ 开关部件&#xff1a;获取开关状态■ 开关部件&#xff1a;示例一&#xff1a;制冷,制暖,开关 ■ LVGL-开关部件 ■ 开关部件&#xff1a;指示器打开的颜色 ■ 开关部…

Leetcode算法题笔记(2)

目录 图论51. 岛屿数量解法一 52. 腐烂的橘子解法一 53. 课程表解法一 54. 实现 Trie (前缀树)解法一 回溯55. 全排列解法一 56. 子集解法一解法二 57. 电话号码的字母组合解法一 58. 组合总和解法一解法二 59. 括号生成解法一解法二 60. 单词搜索解法一 图论 51. 岛屿数量 给…

PostgreSQL FDW(外部表) 简介

1、FDW: 外部表 背景 提供外部数据源的透明访问机制。PostgreSQL fdw(Foreign Data Wrapper)是一种外部访问接口,可以在PG数据库中创建外部表,用户访问的时候与访问本地表的方法一样,支持增删改查。 而数据则是存储在外部,外部可以是一个远程的pg数据库或者其他数据库(…

java数据结构与算法刷题-----LeetCode435. 无重叠区间

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 解题思路&#xff1a;贪心思想。时间复杂度O( n ∗ l o g 2 n n*…

闻了刚脱下的袜子导致肺部感染真菌?后果很严重

之前有网友分享自己只因闻了刚脱下的袜子&#xff0c;就导致了肺部感染真菌的经历&#xff0c;引发众多网友的关注与热议。 那么&#xff0c;臭袜子又怎么会和肺部感染有关系呢&#xff1f;臭袜子为什么不能闻呢&#xff1f;袜子上面到底有什么有危险的成分呢&#xff1f; 图源…

基于Matlab的血管图像增强算法,Matlab实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码代做/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供…

Day20 代码随想录(1刷) 二叉树

目录 654. 最大二叉树 617. 合并二叉树 700. 二叉搜索树中的搜索 98. 验证二叉搜索树 654. 最大二叉树 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。递归地在最大值 左边 的 子数…

Linux: 线程安全

Linux 线程共享了进程的资源(地址空间, 页表等), 多个线程同时访问同一个资源就可能产生问题:数据竞争 临界资源: 多个线程共享的资源临界区: 访问临界资源的区域互斥: 任何时刻, 只有一个执行流能进入临界区同步: 以一定顺序访问临界资源原子性: 要么完成, 玩么未完成 锁 死…

Unity Mobile Notifications推送问题

1.在部分机型点击通知弹窗进不去游戏 把这里改成自己的Activity 2.推送的时候没有横幅跟icon红点 主要是第一句话 注册的时候选项可以选择 defaultNotificationChannel new AndroidNotificationChannel(“default_channel”, “Default Channel”, “For Generic notifica…

由浅到深认识Java语言(24):Date类

该文章Github地址&#xff1a;https://github.com/AntonyCheng/java-notes 在此介绍一下作者开源的SpringBoot项目初始化模板&#xff08;Github仓库地址&#xff1a;https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址&#xff1a;https://blog.c…

Zotero 配置教程Windonws与Linux

Zotero的安装 zotero 官网&#xff1a; Zotero | Your personal research assistant 官方文档 &#xff1a;start [Zotero Documentation] 推荐常用的插件 1、 茉莉花&#xff1a;https://github.com/l0o0/jasminum 2、 Doi管理&#xff1a;https://github.com/bwiernik/zo…

web表单标签与练习(3.18)

一、表单域 表单域是一个包含表单元素的区域。 在HTML标签中&#xff0c;< form >标签用于定义表单域&#xff0c;以实现用户信息和传递。 < form >会把它范围内的表单元素信息提交给服务器。 表单属性 action url地址 用于指定接收并处理表单数据的服务器程序的…

SpringBoot ---HTML转PDF工具

之前项目用的WKHtmlToPdf&#xff0c;速度较慢&#xff0c;现在需要改成基于ITEXT java使用itext7实现html转pdf_java使用itext7实现html转pdf全代码完整示例 cainiaobulan-CSDN博客文章浏览阅读2.7k次。使用itext7html转pdf_java使用itext7实现html转pdf全代码完整示例 caini…

HTML 常用标签总结

本篇文章总结了一些我在学习html时所记录的标签&#xff0c;虽然总结并不是非常全面&#xff0c;但都是一些比较常用的。 html元素标签 首先一个html界面是由无数个元素标签组成的&#xff0c;每个元素具有它的属性 1.input 单行文本框 标签type属性——text <input ty…

第四十五周:文献阅读

目录 摘要 Abstract 文献阅读&#xff1a;基于注意力的双向LSTM和编码器-解码器的水质预测 现有问题 提出方法 创新点 方法论 1、EMD&#xff08;经验模态分解&#xff09; 2、VMD&#xff08;变分模态分解&#xff09; 3、VBAED模型 研究实验 数据集 数据预处理 …

此站点的连接不安全,怎么解决?

有部分的网站用户在打开的时候会被提示“此站点的连接不安全”这种现象为什么会出现&#xff0c;大概率是因为没有安装SSL证书或者SSL证书出现了错误&#xff0c;小编在这里面将展开讲解为大家分析其中的原因以及解决方法。 一&#xff1a;遇到该情况的时候该怎么办&#xff1…

【基于HTML5的网页设计及应用】——随机验证码

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

2024/3/24--爬虫库

1.常用的爬虫库 (1)在setting的project里面点击Python Interpreter (2&#xff09;常用的爬虫库有 import requests //用途&#xff1a;用于发送HTTP请求。from bs4 import BeautifulSoup //用于从HTML或XML文档中提取数据。import scrapy //一个功能强大的爬虫框架&#xf…