【Java数据结构】二叉树详解(二)

🔒文章目录:

1.❤️❤️前言~🥳🎉🎉🎉

2. 二叉树的模拟——正文

2.1获取树中节点的个数 

2.2获取叶子节点的个数

2.3获取第K层节点的个数

2.4获取二叉树的高度  

2.5 检测值为value的元素是否存在

2.6 判断一棵树是不是完全二叉树 

2.7遍历 

2.7.1先序遍历

2.7.2中序遍历 

2.7.3后序遍历

2.7.4层序遍历 

3.二叉树的模拟——使用

4.特别说明 

5.总结


1.❤️❤️前言~🥳🎉🎉🎉

Hello, Hello~ 亲爱的朋友们👋👋,这里是E绵绵呀✍️✍️。

如果你喜欢这篇文章,请别吝啬你的点赞❤️❤️和收藏📖📖。如果你对我的内容感兴趣,记得关注我👀👀以便不错过每一篇精彩。

当然,如果在阅读中发现任何问题或疑问,我非常欢迎你在评论区留言指正🗨️🗨️。让我们共同努力,一起进步!

加油,一起CHIN UP!💪💪

🔗个人主页:E绵绵的博客
📚所属专栏:

1. JAVA知识点专栏

        深入探索JAVA的核心概念与技术细节

2.JAVA题目练习

        实战演练,巩固JAVA编程技能

3.c语言知识点专栏

        揭示c语言的底层逻辑与高级特性

4.c语言题目练习

        挑战自我,提升c语言编程能力

📘 持续更新中,敬请期待❤️❤️

2. 二叉树的模拟——正文

因为我们在上篇文章中已经对二叉树的模拟进行了一个前置的了解,还对二叉树的基础:遍历做了一个深度了解,那么现在我们就可以开始二叉树模拟的正文了,正文中我们将会模拟二叉树的基本方法和二叉树的四种遍历方式(前序,中序,后序,层序)。


二叉树的基本方法如下:

因为在二叉树模拟的前置说明中我们已经创建好了一个二叉树,所以我们以它为操作对象去执行我们模拟的基本方法和四种遍历方式。


2.1获取树中节点的个数 

我们采用递归的方式去实现。具体如下:

定义该函数的名称为 size,它接受一个参数 root,表示以该节点为根的二叉树。

首先定义一个变量 size,用于记录二叉树节点的个数,并初始化为 0。

然后判断 root 是否为 null,如果为 null,说明当前节点为空,直接返回 0。

否则,将 size 加 1,表示当前节点不为空,计入节点个数。

接着,对左子树和右子树进行递归调用 size 函数,分别计算左右子树中节点的个数。

最后将左右子树的节点个数加起来,并加上当前节点,即为整个二叉树的节点个数,返回 size。


int size(BTNode root) {
        int size = 0;
        if (root == null)
            return 0;
        size++;
        size = size + size(root.left);
        size = size + size(root.right);
        return size;
    }

 2.2获取叶子节点的个数

注意:度为0的结点称为叶子结点。

我们设计一个函数名为 getLeafNodeCount,输入参数是二叉树的根节点 root,返回值是整数类型,表示二叉树中叶子节点的数量。

函数的实现思路是:如果二叉树为空,那么叶子节点数量为 0;否则,如果当前节点是叶子节点,则叶子节点数量加 1;接着递归地计算左子树和右子树中叶子节点的数量,并将它们相加作为最终的结果返回。

具体而言,该代码中首先定义了一个变量 size 并初始化为 0。然后通过判断二叉树的根节点是否为空,来处理递归结束的情况。如果当前节点是叶子节点,则将 size 的值加 1;之后则递归地计算左右子树中叶子节点的数量,并将它们累加到 size 中。最后将 size 作为函数的返回值。


 int getLeafNodeCount(BTNode root) {
        int size = 0;
        if (root == null)
            return 0;
        if ((root.left == null) && (root.right == null))
            size++;
        size = size + getLeafNodeCount(root.left);
        size = size + getLeafNodeCount(root.right);
        return size;
    }

 2.3获取第K层节点的个数

具体分析如下:

首先,定义一个函数getKLevelNodeCount,该函数需要传入两个参数:一个是二叉树的根节点root,另一个是需要统计节点个数的层数k。

接着,该函数定义了一个整型变量size并将其初始化为0。

然后,通过对root节点进行判断,若root为空,则返回0;若k为1,则返回1,此时只有根节点符合要求。

接下来,在左右子树中递归查找第k-1层的节点,而后将左右子树第k-1层的节点个数加起来,最终得到母树第k层的节点个数。

最后,返回size变量即可。


 // 获取第K层节点的个数
    int getKLevelNodeCount(BTNode root, int k) {
        int size = 0;
        if (root == null)
            return 0;
        if (k == 1)
            return 1;
        size = size + getKLevelNodeCount(root.left, k - 1);
        size = size + getKLevelNodeCount(root.right, k - 1);
        return size;
    }

2.4获取二叉树的高度  

我们实现一个函数名为 getHeight,接受一个 BTNode 类型的参数 root,返回一个整型值表示二叉树的高度。其实现过程是通过递归方式计算根节点的左右子树高度的最大值,然后加上 1,即为整棵二叉树的高度。其中,当传入的二叉树为空时,直接返回 0。

值得注意的是,该代码使用了 Math.max 函数来比较左右子树高度的大小。这是 Java 内置的一个函数,可以用来获取两个数中的最大值。


  int getHeight(BTNode root) {
        int height = 0;
        if (root == null)
            return 0;
        return Math.max(getHeight(root.left), getHeight(root.right)) + 1;
    }

2.5 检测值为value的元素是否存在

定义一个函数名为find,函数输入参数是一个二叉树的根节点 root 和要查找的值 val,返回值是该值所在的二叉树节点。

具体实现方式是,先判断当前根节点是否为 null,若是则返回 null;若当前节点的值与目标值相等,则返回该节点;否则分别在左子树和右子树中递归查找目标值。如果左右子树都没有找到目标值,则返回 null,如果找到目标值则返回目标值所在的节点

// 检测值为value的元素是否存在
    BTNode find(BTNode root, int val) {
        if (root == null)
            return null;
        if (root.value == val)
            return root;
        BTNode btNode1 = find(root.left, val);
        if (btNode1 != null)
            return btNode1;
        BTNode btNode2 = find(root.right, val);
        if (btNode2 != null)
            return btNode2;

        return null;
    }

2.6 判断一棵树是不是完全二叉树 

其主要思路是通过 BFS(广度优先搜索)算法逐层遍历树,并在遇到第一个空节点时退出循环。然后再检查队列中是否还存在非空节点,若存在,则不是完全二叉树;若不存在,则是完全二叉树。具体解释可见下面分析:

  1. 函数名:isCompleteTree 返回值:boolean类型,表示是否为完全二叉树 参数:BTNode类型,表示二叉树的根节点

  2. 判断根节点是否为空,若为空,则直接返回 true,因为空树也可以看作是完全二叉树。

  3. 创建一个队列 queue,将根节点加入队列。

  4. 开始循环,当队列不为空时,循环体内部分以下操作: a. 取出队首元素 btNode1。 b. 若 btNode1 不为空,则将其左右儿子加入队列。 c. 若 btNode1 为空,则退出循环。

  5. 循环结束后,检查队列中是否还有非空节点。若有,则不是完全二叉树;若没有,则是完全二叉树。(我们能将null输入到队列里,同理队列也能输出null)

  6. 返回判断结果。

注意一个重要的点,之前栈和队列中讲过该知识点:栈和队列都允许存储null值。在栈和队列中,null值被视为一种有效的元素,因此可以被添加到栈和队列中,作为一个元素去存放。

我们如果不清楚该知识点的话这题是绝对想不到怎么解决的,毕竟该题是把null存储在队列中去解决问题的,如果你连null是否能存储在队列中都不清楚的话,又谈何去做该题。

 //判断一棵树是不是完全二叉树
  public  boolean isCompleteTree(BTNode root) {
      if (root == null)
          return true;
      Queue<BTNode> queue = new LinkedList<>();
      queue.offer(root);
      while (!queue.isEmpty()) {
          BTNode btNode1 = queue.poll();
          if (btNode1 != null) {
              queue.offer(btNode1.left);
              queue.offer(btNode1.right);
          } else {
                   break;
          }}
          while(!queue.isEmpty()){
              if(queue.peek()!=null)
                  return false;
              else
                  queue.poll();
          }
                return  true;
  }

2.7遍历 


2.7.1先序遍历

二叉树的先序遍历 遍历顺序为:根节点 -> 左子树 -> 右子树。具体实现步骤如下:

  1. 判断二叉树节点是否为空,如果为空则直接返回。
  2. 输出当前节点的值。
  3. 递归调用前序遍历函数,遍历当前节点的左子树。
  4. 递归调用前序遍历函数,遍历当前节点的右子树。
 //先序遍历
    public void preorder(BTNode btNode) {
        if (btNode == null)
            return;
        System.out.print(btNode.value + " ");
        preorder(btNode.left);
        preorder(btNode.right);
    }

2.7.2中序遍历 

中序遍历是二叉树遍历中的一种,它的遍历顺序是从左子树开始,到根节点,再到右子树。具体实现如下:

  1. 首先判断当前节点是否为 null,如果是则返回。
  2. 对当前节点的左子树进行递归 中序遍历。
  3. 遍历左子树完成后,输出当前节点的值。
  4. 对当前节点的右子树进行递归中序遍历。
  //中序遍历
    public void inorder(BTNode btNode) {
        if (btNode == null)
            return;
        inorder(btNode.left);
        System.out.print(btNode.value + " ");
        inorder(btNode.right);
    }

2.7.3后序遍历

后序遍历是指先访问左子树,再访问右子树,最后访问根节点的遍历方式。具体分析如下:

  1. 首先判断当前节点是否为空,如果为空则直接返回。
  2. 递归后序遍历 遍历当前节点的左子树。
  3. 递归后序遍历 遍历当前节点的右子树。
  4. 输出当前节点的值。
//后序遍历
public void postorder(BTNode btNode) {
if (btNode == null)
return;
postorder(btNode.left);
postorder(btNode.right);
System.out.print(btNode.value + " ");
}

2.7.4层序遍历 

层序遍历是指从根节点开始,按照从上到下、从左到右的顺序依次访问二叉树中的每一个节点。具体分析如下:

  1. 首先判断二叉树的根节点是否为空,如果为空则直接返回。

  2. 创建一个队列(这里使用 Java 中的 LinkedList 实现),将根节点加入队列中。

  3. 当队列不为空时,重复以下操作:

    a. 取出队头元素。

    b. 输出队头元素的值。

    c. 如果队头元素有左子节点,则将左子节点加入队列。

    d. 如果队头元素有右子节点,则将右子节点加入队列。

  4. 当队列为空时,说明遍历完成,退出循环。

  //层序遍历
   public  void levelOrder(BTNode btNode) {
       if (btNode == null)
           return;
       Queue<BTNode> queue = new LinkedList<>();
       queue.offer(btNode);
       while (!queue.isEmpty()){
             BTNode btNode1=queue.poll();
           System.out.print(btNode1.value+"  ");
           if(btNode1.left!=null)
              queue.offer(btNode1.left);
           if(btNode1.right!=null)
              queue.offer(btNode1.right);
       }
   }

 3.二叉树的模拟——使用

  以下是模拟的二叉树的全部代码

public class BinaryTree {
    static class BTNode {
        int value;
        BTNode left;
        BTNode right;

        public BTNode(int value){
        this.value = value;
        }
    }

    public BTNode creatBinaryTree() {
        BTNode btNode1 = new BTNode(1);
        BTNode btNode2 = new BTNode(2);
        BTNode btNode3 = new BTNode(3);
        BTNode btNode4 = new BTNode(4);
        BTNode btNode5 = new BTNode(5);
        BTNode btNode6 = new BTNode(6);
        BTNode btNode7 = new BTNode(7);
        btNode1.left = btNode2;
        btNode1.right = btNode3;
        btNode2.left = btNode4;
        btNode2.right = btNode5;
        btNode3.right = btNode6;
        btNode5.left = btNode7;
        return btNode1;
    }


    //先序遍历
    public void preorder(BTNode btNode) {
        if (btNode == null)
            return;
        System.out.print(btNode.value + " ");
        preorder(btNode.left);
        preorder(btNode.right);
    }

    //中序遍历
    public void inorder(BTNode btNode) {
        if (btNode == null)
            return;
        inorder(btNode.left);
        System.out.print(btNode.value + " ");
        inorder(btNode.right);
    }

    //后序遍历
    public void postorder(BTNode btNode) {
        if (btNode == null)
            return;
        postorder(btNode.left);
        postorder(btNode.right);
        System.out.print(btNode.value + " ");
    }
    //层序遍历
   public  void levelOrder(BTNode btNode) {
       if (btNode == null)
           return;
       Queue<BTNode> queue = new LinkedList<>();
       queue.offer(btNode);
       while (!queue.isEmpty()){
             BTNode btNode1=queue.poll();
           System.out.print(btNode1.value+"  ");
           if(btNode1.left!=null)
              queue.offer(btNode1.left);
           if(btNode1.right!=null)
              queue.offer(btNode1.right);
       }
   }

    //得出树的节点数量
    int size(BTNode root) {
        int size = 0;
        if (root == null)
            return 0;
        size++;
        size = size + size(root.left);
        size = size + size(root.right);
        return size;
    }

    // 获取叶子节点的个数
    int getLeafNodeCount(BTNode root) {
        int size = 0;
        if (root == null)
            return 0;
        if ((root.left == null) && (root.right == null))
            size++;
        size = size + getLeafNodeCount(root.left);
        size = size + getLeafNodeCount(root.right);
        return size;
    }

    // 获取第K层节点的个数
    int getKLevelNodeCount(BTNode root, int k) {
        int size = 0;
        if (root == null)
            return 0;
        if (k == 1)
            return 1;
        size = size + getKLevelNodeCount(root.left, k - 1);
        size = size + getKLevelNodeCount(root.right, k - 1);
        return size;
    }


    // 获取二叉树的高度
    int getHeight(BTNode root) {
        int height = 0;
        if (root == null)
            return 0;
        return Math.max(getHeight(root.left), getHeight(root.right)) + 1;
    }

    // 检测值为value的元素是否存在
    BTNode find(BTNode root, int val) {
        if (root == null)
            return null;
        if (root.value == val)
            return root;
        BTNode btNode1 = find(root.left, val);
        if (btNode1 != null)
            return btNode1;
        BTNode btNode2 = find(root.right, val);
        if (btNode2 != null)
            return btNode2;

        return null;
    }

//判断一棵树是不是完全二叉树
  public  boolean isCompleteTree(BTNode root) {
      if (root == null)
          return true;
      Queue<BTNode> queue = new LinkedList<>();
      queue.offer(root);
      while (!queue.isEmpty()) {
          BTNode btNode1 = queue.poll();
          if (btNode1 != null) {
              queue.offer(btNode1.left);
              queue.offer(btNode1.right);
          } else {
                   break;
          }}
          while(!queue.isEmpty()){
              if(queue.peek()!=null)
                  return false;
              else
                  queue.poll();
          }
                return  true;
  }
}

我们将对上述模拟的二叉树进行使用,代码如下:

 
public class Test1 {
    public static void main(String[] args) {
        BinaryTree binaryTree=new BinaryTree();
        BinaryTree.BTNode btNode=binaryTree.creatBinaryTree();
        binaryTree.preorder(btNode);
        System.out.println();
        binaryTree.inorder(btNode);
        System.out.println();
        binaryTree.postorder(btNode);
        System.out.println();
        binaryTree.levelOrder(btNode);
        System.out.println();
        System.out.println(binaryTree.size(btNode));//节点个数
        System.out.println(binaryTree.getLeafNodeCount(btNode));//叶子节点个数
        System.out.println(binaryTree.getKLevelNodeCount(btNode, 3));//树的第三层的节点数
        System.out.println(binaryTree.getHeight(btNode));//树的高度
        System.out.println(binaryTree.size(binaryTree.find(btNode, 2)));
        //检测树中值为2的节点是否存在,如果存在,打印出该节点作为根节点时所代表的子树的节点数
        System.out.println(binaryTree.isCompleteTree(btNode));//检测是否为完全二叉树
    }


}

 创建的树如下:


执行之后的结果如下:


我们发现其执行结果是如我们预料的一样,完全正确,所以二叉树的模拟就成功了,之后可以安心使用它了。

4.特别说明 

对于我们上述模拟出来的二叉树,其在集合框架中并没有对应的类去实现。

那没有对应的类去实现它?我们为什么还要模拟呢?不白白浪费精力?

其实,我们之所以模拟出来这个二叉树,是为了打好基础。虽然我们模拟出来的这个二叉树并没有对应的类去实现,但在之后的学习中我们会学到堆,红黑树等,这些也都是二叉树,并且这些二叉树在集合框架中会有对应类去实现它们,所以我们现在模拟一个二叉树只是为了对二叉树有个更清晰的认知,为后序的堆,红黑树等其他一些二叉树的学习打好基础。

5.总结

所以这篇文章结束后,我们的二叉树的知识点就全讲解完了,下篇文章将会给大家带来二叉树的习题讲解。在此,我们诚挚地邀请各位大佬们为我们点赞、关注,并在评论区留下您宝贵的意见与建议。让我们共同学习,共同进步,为知识的海洋增添更多宝贵的财富!🎉🎉🎉❤️❤️💕💕🥳👏👏👏 

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

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

相关文章

明天15点!如何打好重保预防针:迎战HVV经验分享

在当今数字化时代&#xff0c;网络攻击日益猖獗&#xff0c;各行各业面临的网络安全威胁不断升级。从钓鱼邮件到复杂的APT攻击&#xff0c;网络犯罪分子的手法层出不穷&#xff0c;给各行各业的信息安全带来了前所未有的挑战。 在这样的背景下&#xff0c;"HVV行动"应…

【案例实战】 基于OpenCV实现鹿茸面积计算

学习《人工智能应用软件开发》&#xff0c;学会所有OpenCV技能就这么简单&#xff01; 做真正的OpenCV开发者&#xff0c;从入门到入职&#xff0c;一步到位&#xff01; 有人在我得B站答疑群里发了下面的图&#xff1a; 问&#xff1a;如何计算鹿茸最外圈蜡皮面积占整个鹿茸…

从人才战略到人才生态,金徽酒高增长的“明线”与“暗线”

执笔 | 文 清 编辑 | 扬 灵 2016年3月&#xff0c;金徽酒于A股上市&#xff0c;全年实现营收12.77亿元。2023年&#xff0c;金徽酒实现营收25.48亿元&#xff0c;比上市当年增加99.5%&#xff0c;近乎翻倍。而当我们深度关注金徽酒&#xff0c;在其业绩高增长的“明线”背…

弘君资本:半导体板块强势拉升,上海贝岭涨停,台基股份等大涨

半导体板块5日盘中强势拉升&#xff0c;到发稿&#xff0c;台基股份涨超15%&#xff0c;中晶科技、上海贝岭等涨停&#xff0c;国科微、长川科技涨超7%&#xff0c;紫光国微、富满微、金海通等涨超5%。 组织表示&#xff0c;半导体职业处于历史较低水平&#xff0c;大基金三期…

通配符https数字证书260

随着越来越多的人开始使用互联网&#xff0c;互联网上的信息变得繁杂&#xff0c;用户很难识别网站信息的真实性&#xff0c;为了维护互联网的环境&#xff0c;开发者开始使用https证书对网站传输数据进行加密和身份认证&#xff0c;以此来保护用户的隐私以及标示网站的真实性。…

电脑e盘不见了,看这三个解决方法

在使用电脑的过程中&#xff0c;我们有时会遇到E盘突然消失的情况&#xff0c;这无疑给我们的数据管理和使用带来了很大的困扰。那么&#xff0c;电脑e盘不见了是怎么回事呢&#xff1f;本文将为你讲解可能的原因&#xff0c;并为你提供三个实用的解决方法。通过了解这些原因和…

通用漏洞-crlfurl重定向拒绝服务攻击

1.crlf注入 1.1原理 crlf是在数据包头头部采取一些回车加换行的操作&#xff0c;把自己的其他代码放到数据包中去覆盖掉原本的数据的方法&#xff0c;常配合xss漏洞使用&#xff0c;这个漏洞本身的造成危害并不严重&#xff0c;CRLF Injection又叫HTTP响应拆分/截断&#xff…

下载Keil芯片包的方法

Keil里面弹出来的这个蓝色超链接&#xff0c;没梯子不要用edge浏览器 Arm Keil | Devices

回归方程 | 海洋气象中的应用

下面的内容为大家讲解关于非线性回归的内容&#xff0c;下面先带着大家回顾一下回归方程 回归方程 利用样本数据建立因变量(预报量)与一个或者多个自变量(预报因子)之间的统计关系经验方程式(回归方程)&#xff0c;用以描述预报量随自变量的平均变化情况&#xff0c;并据此对…

什么时候需要用到 @EnableWebSecurity 注解?

有小伙伴在学习 Spring Security 的遇到一个问题&#xff1a; 箭头所指的位置报红&#xff0c;也就是 Spring 容器中没有找到一个类型为 HttpSecurity 的 Bean。 小伙伴说如果他在配置类上加 EnableWebSecurity 注解&#xff0c;就不报错&#xff1b;不加该注解则会报错。那么…

C语言数据结构排序、插入排序、希尔排序(多组并排、一组排完排另一组)、选择排序、堆排序、冒泡排序等的介绍

文章目录 前言打印数组函数一、插入排序二、希尔排序三、选择排序四、堆排序五、冒泡排序总结 前言 C语言数据结构排序、插入排序、希尔排序&#xff08;多组并排、一组排完排另一组&#xff09;、选择排序、堆排序、冒泡排序等的介绍 打印数组函数 打印数组函数定义 // 打印…

Angular17(1):使用Angular CLI创建空项目

要创建一个空的 Angular 项目&#xff0c;可以使用 Angular CLI&#xff08;命令行界面&#xff09;。以下是使用 Angular CLI 创建一个新项目的步骤&#xff1a; 1、安装 Angular CLI&#xff1a; 打开你的命令行界面&#xff08;在 Windows 上是 CMD、PowerShell 或 Git Bas…

反向海淘代购系统|pandabuy系统方案|系统流程讲解:引领全球购物新潮流

随着全球化的深入发展和互联网技术的不断进步&#xff0c;人们的购物方式也在发生着翻天覆地的变化。反向海淘代购系统作为这一变革的杰出代表&#xff0c;正逐渐走进大众视野&#xff0c;为消费者带来前所未有的全球购物体验。 一、反向海淘代购系统的定义 传统的海淘模式主…

【网络通信层】华为云连接MQTT设备

本文介绍华为云设备连接到设备的操作。 目录 一、在华为云创建设备 二、连接MQTT 三、通信 一、在华为云创建设备 现在华为云上可以免费使用部分受限服务&#xff0c;包括免费创建自己的设备连接。 首先&#xff0c;登录华为云平台共建智能世界云底座-华为云 (huaweicl…

Flink SQL查询语法部分详解(提供需求、数据练习复现)

一、Hints 动态表选择&#xff1a;可以在查询表的时候动态修改表的参数配置 1、读取kafka的数据建表 CREATE TABLE students (id STRING,name STRING,age INT,sex STRING,clazz STRING ) WITH (connector kafka,topic students, -- 指定topicproperties.bootstrap.servers …

root账号,cmd命令行能用ssh连上服务器,但是vscode连接报错Permission denied,please try again

☆ 问题描述 但是cmd能连接上 ★ 解决方案 点击 然后add到自己的配置文件下 重新选择 这个时候就会出现刚刚添加的&#xff0c;点击选择 输入密码 然后就ok了 ✅ 总结 只能说&#xff1a;玄学&#xff01;

美洽工作台3.0,全新发布!

美洽工作台3.0&#xff0c;全新发布 想要效率翻倍&#xff0c;就要一步到位&#xff01; 工作台 3.0&#xff0c;为效率而生 1. 更丰富的外观选择&#xff0c;让界面焕然一新&#xff0c;新增导航主题色选择&#xff0c;深色 Dark、浅色 Light 随意切换 2. 自定义你的专属导…

以真机算力剑指实用化!这家中国量子计算公司的应用探索

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 文丨浪味仙/王珩 排版丨沛贤 深度好文&#xff1a;1500字丨5分钟阅读 近些年来&#xff0c;由于底层物理的限制&#xff0c;经典集成电路通过缩小工艺制程提升算力的路线正在逼近极限&#xf…

RK3568技术笔记之一 RK3568总体介绍

RK3568是瑞芯微开发出一款很好用的芯片。我先把ROCKCHIP的原厂信息搬过来看看。 首先声明一下&#xff0c;这篇文章里的资讯版权归瑞芯微电子股份有限公司。毕竟是我转过来的嘛。 我自己的心得&#xff0c;版权就归我啦。 搬砖地址Rockchip-瑞芯微电子股份有限公司瑞芯微专注…

Django项目上线-报错汇总

Django项目上线-报错汇总 下列报错基本都是Python环境相关 pip install 报错 WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available. debian运行pip报错ssl module in Python is not available - z417 - 博…