数据结构小白之浅析二叉排序树(bst)

2023-11-12

1.什么是二叉排序树

二叉排序树(binary sort tree),简称为bst,是一种无论是查询还是添加都相对较快速的数据结构。

相比于数组而言: 

*未排序的数组: 可以直接在数组的尾部进行添加数据,但是查找的速度慢

*排序的数组: 可以使用二分查找的方法,查找的速度快,但是为了保证数组的有序性,在添加数据的过程中的速度偏慢

相比于链表而言:
*无论链表是否是有序的,链表添加的速度很快,无需数据整体进行移动;但是链表查找的速度较慢

因此我们选择使用bst进行数据的存储和查询,可以较好地弥补上述数据结构的缺陷

 

二叉排序树的特点:

对于bst中任何一个非叶子节点,要求左子节点的值比当前节点小,右子节点的值比当前节点大;如果有相同的值,放在左右均可

 

二叉排序树图解: (左子节点的值比当前父节点值小,右子节点的值比当前父节点值大)

2.代码实现

2-1:二叉排序树的添加思路(由于遍历思路在之前说过,这里不再赘述)

2-2:添加以及遍历的代码实现

 //1.递归添加节点(添加的过程中已经排好了顺序)
    public void add(Node node) {
        if (node == null) {
            return;
        }
        //判断传入节点的值和当前子树的根节点的关系
        //小于该节点
        if (node.value < this.value) {
            //当前节点的左子节点为空
            if (this.left == null) {
                this.left = node;//如果当前节点的左子节点为空,直接挂在下面即可
            } else {
                //开始递归向左进行添加
                this.left.add(node);
            }
        } else {
            //大于等于该节点
            if (this.right == null) {
                this.right = node;//如果当前节点的右子节点为空,直接挂在下面即可
            } else {
                this.right.add(node);
            }
        }
//2.写一个中序遍历方法 左根右
    //使用中序遍历可以得到从小到大的序列(略微思考一下)
    public void infixOrder() {
        if (this.left != null) {
            this.left.infixOrder();
        }
        System.out.print(this+" ");
        if (this.right != null) {
            this.right.infixOrder();
        }
    }

    }

  

2-3:二叉排序树的删除思路(在这里要分为三种情况去考虑)

 

2-4:首先去看看三种情况公有的查询节点以及查询父节点的代码

//查询当前节点(递归查询)
 
 public Node search(int value) {
        //当前就是该节点
        if (value == this.value) {
            return this;
        }
        //如果不是当前节点
        //查找的值小于当前节点
        else if (value < this.value) {
            //当前节点的左子节点不为空
            if (this.left == null) {
                return null;
            }
            return this.left.search(value);
        }
        //查找的值不小于当前节点(右子树递归)
        else {
            if (this.right == null) {
                return null;
            }
            return this.right.search(value);
        }
    }
//查找要删除节点的父节点
    /**
     * value 要查找节点的值
     * 返回的是要删除节点的父节点值,如果没有就返回null
     * */
    public Node searchParent(int value){
        //如果当前节点就是要删除节点的父节点就返回
        if((this.left!=null && this.left.value==value)
                || (this.right!=null && this.right.value==value)){
            return this;
        }else {
            //如果查找的值小于当前节点的值,并且当前节点的左子节点不为空
            if(value<this.value && this.left!=null){
                return this.left.searchParent(value);
            //如果查找的值大于等于当前节点的值 并且当前节点的右子节点不为空
            }else if (value>=this.value && this.right!=null){
                return this.right.searchParent(value);
            }else{
                return null;//没有找到父节点
            }
        }

    }

2-5:删除节点之删除叶子节点

Node targetNode = search(value);
            //如果没有找到待删除的节点
            if (targetNode == null) {
                return;
            }
            //如果发现当前二叉排序树只有最后一个节点(二叉排序树只有一个节点)
            if (root.left == null && root.right == null) {
                root = null;
                return;
            }
            //现在已经找到了该节点
            //找到targetNode的父节点
            Node parent = searchParent(value);
            //如果删除的节点是叶子节点
            if (targetNode.left == null && targetNode.right == null) {
                //如果targetNode是parent的左子节点
                if (parent.left != null && parent.left.value == value) {
                    parent.left = null;
                }
                //如果targetNode是parent的右子节点
                else if (parent.right != null && parent.right.value == value) {
                    parent.right = null;
                }
            }

2-6: 删除节点之删除有两个子节点的节点

注:实现方法的前提是需要实现一个方法,可以遍历节点右子树的最小值,方便替代(或者遍历节点的左子树的最大值,方便替代)

 public int delRightTreeMin(Node node) {
        Node target = node;
        //循环查找左节点,就会找到最小值
        while (target.left != null) {
            target = target.left;
        }
        //在循环结束之后已经找到了最小的值,将它删掉
        //删除最小节点
        delNode(target.value);
        return target.value;
    }
  else if (targetNode.left != null && targetNode.right != null) {
                //从target的右子树找到最小的节点,用一个临时变量保存最小的节点,删除最小节点,将temp进行赋值
                int minVal = delRightTreeMin(targetNode.right);
                targetNode.value = minVal;
            }
            //如果删除的节点有一棵子树(如果只剩下了两个节点需要特别注意)
            else {
                //如果要删除的节点有左子节点
                if (targetNode.left != null) {
                    //!!!分析删除两个节点的情况
                    if (parent != null) {
                        //如果targetNode 是 parent的左子节点
                        if (parent.left.value == value) {

                            parent.left = targetNode.left;
                        } else {//targetNode 是 parent的右子节点
                            parent.right = targetNode.left;
                        }
                    } else {
                        //当删除两个节点的时候,把根节点直接给子节点即可
                        root = targetNode.left;
                    }
        }

2.7删除节点之删除有一个子节点的节点

   else {
                //如果要删除的节点有左子节点
                if (targetNode.left != null) {
                    //!!!分析删除两个节点的情况
                    if (parent != null) {
                        //如果targetNode 是 parent的左子节点
                        if (parent.left.value == value) {

                            parent.left = targetNode.left;
                        } else {//targetNode 是 parent的右子节点
                            parent.right = targetNode.left;
                        }
                    } else {
                        //当删除两个节点的时候,把根节点直接给子节点即可
                        root = targetNode.left;
                    }
                } else {//如果要删除的节点有右子节点
                    //如果targetNode 是 parent的左子节点
                    if (parent != null) {
                        if (parent.left.value == value) {
                            parent.left = targetNode.right;
                        } else {
                            parent.right = targetNode.right;
                        }
                    }else{
                        root=targetNode.right;
                    }
                }
            }

 

3.完整代码实现

package tree_op.binary_sort_tree;

//创建二叉排序树
public class BinarySortTree {
    private Node root;

    public Node getRoot() {
        return root;
    }

    //添加节点的方法
    public void add(Node node) {
        if (root == null) {
            root = node;//root为空,就直接让root指向node
        } else {
            root.add(node);
        }
    }

    //查询节点
    public Node search(int value) {
        if (root == null) {
            return null;
        } else {
            return root.search(value);
        }
    }

    //查询节点的父节点
    public Node searchParent(int value) {
        if (root == null) {
            return null;
        } else {
            return root.searchParent(value);
        }
    }

    //删除节点
    public void delNode(int value) {
        if (root == null) {
            return;
        } else {
            //1.先找到要删除的节点 targetNode
            Node targetNode = search(value);
            //如果没有找到待删除的节点
            if (targetNode == null) {
                return;
            }
            //如果发现当前二叉排序树只有最后一个节点(二叉排序树只有一个节点)
            if (root.left == null && root.right == null) {
                root = null;
                return;
            }
            //现在已经找到了该节点
            //找到targetNode的父节点
            Node parent = searchParent(value);
            //如果删除的节点是叶子节点
            if (targetNode.left == null && targetNode.right == null) {
                //如果targetNode是parent的左子节点
                if (parent.left != null && parent.left.value == value) {
                    parent.left = null;
                }
                //如果targetNode是parent的右子节点
                else if (parent.right != null && parent.right.value == value) {
                    parent.right = null;
                }
            }
            //如果删除的节点有两棵子树
            else if (targetNode.left != null && targetNode.right != null) {
                //从target的右子树找到最小的节点,用一个临时变量保存最小的节点,删除最小节点,将temp进行赋值
                int minVal = delRightTreeMin(targetNode.right);
                targetNode.value = minVal;
            }
            //如果删除的节点有一个子节点(如果只剩下了两个节点需要特别注意)
            else {
                //如果要删除的节点有左子节点
                if (targetNode.left != null) {
                    //!!!分析删除两个节点的情况
                    if (parent != null) {
                        //如果targetNode 是 parent的左子节点
                        if (parent.left.value == value) {

                            parent.left = targetNode.left;
                        } else {//targetNode 是 parent的右子节点
                            parent.right = targetNode.left;
                        }
                    } else {
                        //当删除两个节点的时候,把根节点直接给子节点即可
                        root = targetNode.left;
                    }
                } else {//如果要删除的节点有右子节点
                    //如果targetNode 是 parent的左子节点
                    if (parent != null) {
                        if (parent.left.value == value) {
                            parent.left = targetNode.right;
                        } else {
                            parent.right = targetNode.right;
                        }
                    }else{
                        root=targetNode.right;
                    }
                }
            }
        }
    }
    //找到右侧最小节点

    /**
     * node: 传入的节点(当做二叉排序树的根节点)
     * 返回的是以node为 根节点的二叉排序树的最小节点值
     * 删除以node为根节点的二叉排序树的最小节点
     */
    public int delRightTreeMin(Node node) {
        Node target = node;
        //循环查找左节点,就会找到最小值
        while (target.left != null) {
            target = target.left;
        }
        //在循环结束之后已经找到了最小的值,将它删掉
        //删除最小节点
        delNode(target.value);
        return target.value;
    }

    //中序遍历
    public void infixOrder() {
        if (root != null) {
            root.infixOrder();
        } else {
            System.out.println("当前二叉排序树为空,无法遍历");
        }
    }

}
package tree_op.binary_sort_tree;

public class BinarySortTreeDemo {
    public static void main(String[] args) {
        int[]arr={7,3,10,12,5,1,9,2};
        BinarySortTree binarySortTree = new BinarySortTree();
        //循环添加节点到二叉排序树中
        for(int i=0;i<arr.length;i++){
            binarySortTree.add(new Node(arr[i]));
        }
        //中序遍历(使用中序排序 刚好可以从最小的那个值进行遍历)
        binarySortTree.infixOrder();
        binarySortTree.delNode(1);
        binarySortTree.delNode(7);
        binarySortTree.delNode(10);
        //binarySortTree.delNode(3);
        //binarySortTree.delNode(5);
        //binarySortTree.delNode(9);
        //binarySortTree.delNode(12);
        //binarySortTree.delNode(2);
        //全部删除
        System.out.println();
        System.out.print("删除后情况:");
        binarySortTree.infixOrder();

    }
}
package tree_op.binary_sort_tree;

//创建Node节点
public class Node {
    int value;
    Node left;
    Node right;

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

    @Override
    public String toString() {
        return "Node{" +
                "value=" + value +
                '}';
    }

    //1.递归添加节点(添加的过程中已经排好了顺序)
    public void add(Node node) {
        if (node == null) {
            return;
        }
        //判断传入节点的值和当前子树的根节点的关系
        //小于该节点
        if (node.value < this.value) {
            //当前节点的左子节点为空
            if (this.left == null) {
                this.left = node;//如果当前节点的左子节点为空,直接挂在下面即可
            } else {
                //开始递归向左进行添加
                this.left.add(node);
            }
        } else {
            //大于等于该节点
            if (this.right == null) {
                this.right = node;//如果当前节点的右子节点为空,直接挂在下面即可
            } else {
                this.right.add(node);
            }
        }


    }

    //2.写一个中序遍历方法 左根右
    //使用中序遍历可以得到从小到大的序列(略微思考一下)
    public void infixOrder() {
        if (this.left != null) {
            this.left.infixOrder();
        }
        System.out.print(this+" ");
        if (this.right != null) {
            this.right.infixOrder();
        }
    }

    //查找需要删除的节点
    /**
     * value 需要删除的节点的值
     * 如果找到返回该节点,否则返回null
     */
    public Node search(int value) {
        //当前就是该节点
        if (value == this.value) {
            return this;
        }
        //如果不是当前节点
        //查找的值小于当前节点
        else if (value < this.value) {
            //当前节点的左子节点不为空
            if (this.left == null) {
                return null;
            }
            return this.left.search(value);
        }
        //查找的值不小于当前节点(右子树递归)
        else {
            if (this.right == null) {
                return null;
            }
            return this.right.search(value);
        }
    }

    //查找要删除节点的父节点
    /**
     * value 要查找节点的值
     * 返回的是要删除节点的父节点值,如果没有就返回null
     * */
    public Node searchParent(int value){
        //如果当前节点就是要删除节点的父节点就返回
        if((this.left!=null && this.left.value==value)
                || (this.right!=null && this.right.value==value)){
            return this;
        }else {
            //如果查找的值小于当前节点的值,并且当前节点的左子节点不为空
            if(value<this.value && this.left!=null){
                return this.left.searchParent(value);
            //如果查找的值大于等于当前节点的值 并且当前节点的右子节点不为空
            }else if (value>=this.value && this.right!=null){
                return this.right.searchParent(value);
            }else{
                return null;//没有找到父节点
            }
        }

    }

}


4.测试结果

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构小白之浅析二叉排序树(bst) 的相关文章

  • 算法:双指针

    双指针 双指针是一种思想或一种技巧并不是特别具体的算法 具体就是用两个变量动态存储两个结点 来方便我们进行一些操作 通常用在线性的数据结构中 特别是链表类的题目 经常需要用到两个或多个指针配合来记忆链表上的节点 完成某些操作 常见的双指针方
  • 以OpenGL/ES视角介绍gfx-hal(Vulkan) Shader/Program接口使用

    文档列表见 Rust 移动端跨平台复杂图形渲染项目开发系列总结 目录 背景 The right way to tackle this in Vulkan is to use resource descriptors A descriptor
  • 数据库多维迭代算法

    关键词 数据库 迭代 递归 多维 一 两种传统的数据库迭代结构算法 对于数据库的迭代结构 有两种传统的算法 递归算法和边界算法 比如对于下面图1的结构 图1 递归算法的数据结构如表1所示 节点id 节点值 父节点id 1 1111 2 3
  • 数据结构中常见的树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)

    原文 http blog csdn net sup heaven article details 39313731 数据结构中常见的树 BST二叉搜索树 AVL平衡二叉树 RBT红黑树 B 树 B 树 B 树 转载 2014年09月16日
  • netty handler的执行顺序(3)

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 今天解决2个问题 1 handler在pipeline当中究竟是如何存储的 2 在遍历handler的过程中 会根据event的不同 调用不同的handler 这一点是如何
  • 《Linux From Scratch》第三部分:构建LFS系统 第六章:安装基本的系统软件- 6.29. Coreutils-8.23...

    Coreutils 软件包包含用于显示和设置基本系统特性的工具 大概编译时间 2 5 SBU 需要磁盘空间 193 MB 6 29 1 安装 Coreutils POSIX 要求 Coreutils 中的程序即使在多字节语言环境也能正确识别
  • 直线检测方法—LSD论文翻译

    附原文链接 LSD a Line Segment Detector 摘 要 LSD是一个线段检测器 能够在线性时间内得到亚像素级精度的检测结果 它无需调试参数就可以适用于任何数字图像上 并且能够自我控制错误数量的检测 平均来说 一个图像中允
  • 一文弄懂循环链表、双向链表、静态链表

    循环链表 双向链表 静态链表 三遍定律 理解了单链表本文的理解易如反掌 单链表请点击这里 理解了单链表本文的理解易如反掌 单链表请点击这里 理解了单链表本文的理解易如反掌 单链表请点击这里 1 循环链表 将单链表中终端结点的指针端由空指针改
  • 4399 C++笔试题

    1 写出一个函数 取到链表中倒数第二个节点 双链表 node getSec List mylist return mylist m tail gt m prev m prev为链表前指针 单链表 node getSec List mylis
  • Hash映射理解

    先说数组 数组优点之一 能通过索引很快定位到值 hashmap 就是利用了数组这个优点 对比 线性映射 定义一个数组 数组的元素是结构体 结构体包括 一对键 值 伪代码表示 a 0 struct Bill 5 a 1 struct KK 6
  • 数据结构小白之插入排序算法

    1 插入排序 1 1 思路 将n个需要排序的元素看成两个部分 一个是有序部分 一个是无序部分 开始的时候有序表只有一个元素 无序表有n 1个元素 排序过程中每次从无序表中取出元素 然后插入到有序表的适当位置 从而成为新的有序表 类似排队 如
  • 『Python基础-15』递归函数 Recursion Function

    什么是递归函数 一种计算过程 如果其中每一步都要用到前一步或前几步的结果 称为递归的 用递归过程定义的函数 称为递归函数 例如连加 连乘及阶乘等 凡是递归的函数 都是可计算的 即能行的 递归就是一个函数在它的函数体内调用它自身 编程语言中的
  • 数据结构之图的两种遍历实现(C语言版)

    上一期文章分享完了图的两种遍历方式 也是两种很重要的算法 DFS和BFS 这两种算法的应用和重要性我就不多说了 内行的人懂的都懂 今天这文章重要就是来上机实现这两种算法 又由于这两种算法都可以由邻接矩阵和邻接表来表示 博主分享的代码都是上机
  • 算法系列15天速成——第八天 线性表【下】

    一 线性表的简单回顾 上一篇跟大家聊过 线性表 顺序存储 通过实验 大家也知道 如果我每次向 顺序表的头部插入元素 都会引起痉挛 效率比较低下 第二点我们用顺序存储时 容 易受到长度的限制 反之就会造成空间资源的浪费 二 链表 对于顺序表存
  • 字符串09--表示数值的字符串

    字符串09 表示数值的字符串 jz53 题目概述 解析 参考答案 注意事项 说明 题目概述 算法说明 请实现一个函数用来判断字符串是否表示数值 包括整数和小数 例如 字符串 100 5e2 123 3 1416 和 1E 16 都表示数值
  • CRC校验(二)

    CRC校验 二 参考 https blog csdn net liyuanbhu article details 7882789 https www cnblogs com esestt archive 2007 08 09 848856
  • 时间复杂度+常见复杂度解释

    前言 算法的效率 虽然计算机能快速的完成运算处理 但实际上 它也需要根据输入数据的大小和算法效率来消耗一定的处理器资源 要想编写出能高效运行的程序 我们就需要考虑到算法的效率 算法的效率主要由以下两个复杂度来评估 时间复杂度 评估执行程序所
  • 【试题】排列组合

    在写一个远程的代码 如果本地有M个显示器 远程有N个显示器 M lt N 依据分辨率 显示器刷新频率等要求 需要对远程的N个显示器进行最佳分辨率修改 之后 需要从N个远程显示器中选择M个 跟本地显示器进行一对一的匹配 即从 A N M N
  • 查找数组中第二大的数

    快速找出一个数组中的最大数 第二大数 思路 如果当 前元素大于最大数 max 则让第二大数等于原来的最大数 max 再把当前元素的值赋给 max 如果当前的元素大于等于第二大数secondMax的值而小于最大数max的值 则要把当前元素的值
  • Leetcode1094. 拼车

    Every day a Leetcode 题目来源 1094 拼车 解法1 差分数组 对于本题 设 a i 表示车行驶到位置 i 时车上的人数 我们需要判断是否所有 a i 都不超过 capacity trips i 相当于把 a 中下标从

随机推荐

  • 你好请问,postman不登录联网怎么使用mock Server

    你好 Postman 具有内置的 mock server 功能 因此无需联网即可使用 要使用 mock server 请执行以下步骤 打开 Postman 应用程序 创建一个新的请求 或打开一个现有的请求 在请求的右上角 单击 更多 按钮
  • pyqt窗口控件跟随窗口大小变化而变化的方法

    要做的很简单 使用qtdesigner对设计的界面配置一下layout 页面布局 即可实现拖拽时界面中控件的放大缩小 这是布局时的几种方式 重点 用designer时要注意 不要选中多个控件然后右键选择layout 要直接在mainwind
  • 恶意代码分析实战07-02

    先peview看看exe程序 注意到这里有两个kernel32 dll 不过仔细看的话 发现其中有一个是假的 名字为kerne132 dll kernel的l被换成了1 而且出现了lab07 03 dll 看来运行这个exe的时候会加载这个
  • 常见JMeter面试题

    1 什么是JMeter JMeter是一种开源的性能测试工具 可以用于测试静态和动态资源 如Web应用程序 数据库 FTP服务器等 2 JMeter可以测试哪些类型的应用 JMeter可以测试各种类型的应用程序 包括Web应用程序 数据库服
  • Python中[:2]、[:,-1]、[-1]、[:-1]、[::-1]、[2::-1]如何使用

    数据准备 import numpy as np X np array 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 print X 形成矩阵 1 print X 1 取最后一个元素 2
  • C++检测异常assert()函数

    1 assert 函数使用 assert 一般用于debug下异常检测的功能函数 例如文件打开是否成功 函数形参传入是否理想 变量定义是否正确等 总的来说其作用是如果它的条件返回错误 则终止程序执行 原型定义 include
  • 如何用PHP写一个excel文件并导出

    其实用PHP写一个excel文件并下载下来很容易 这里我们使用了PHPExcel库去实现一个例子
  • Java基础篇--工具类操作之敏感词过滤

    编写敏感词过滤程序 说明 在网络程序中 如聊天室 聊天软件等 经常需要对一些用户所提交的聊天内容中的敏感性词语进行过滤 如 性 色情 爆炸 恐怖 枪 军火 等 这些都不可以在网上进行传播 需要过滤掉或者用其他词语替换掉 提示 将用户的聊天内
  • Python3,如何实现CPU的并行计算,那还不简单,5种方式,这篇就搞定。

    多进程实现CPU并行计算 1 引言 2 实战 2 1 多进程模式 2 1 1 定义 2 1 2 multiprocessing 2 1 3 模式 2 1 4 适用场景 2 1 4 代码示例 2 2 执行方法 2 2 1 多线程并发执行 2
  • 高德导航红绿灯为啥能读秒?

    来源 JavaEdge 1 内部员工吐露 2 真正的内幕 免责声明 任何文章不要过度深思 万事万物都经不起审视 因为世上没有同样的成长环境 也没有同样的认知水平 更 没有适用于所有人的解决方案 不要急着评判文章列出的观点 只需代入其中 适度
  • 外汇高概率一分钟交易系统

    交易系统前置 建议资金 10000美金 交易品种 黄金 交易周期 1分钟 使用指标 Ichimoku Kinko Hyo 注 只留上下Kumo 其他线隐藏 MACD MA15 MA55 交易仓位 建议每次交易 0 05手 交易入场条件 MA
  • MATLAB深度学习LSTM 标签分类classificationLayer层,YTrain的设置出错

    问题 使用matlab深度学习工具箱进行标签分类 设置XTrain为输入是n 1的元胞数组 每个元胞数据有6个特征值 YTrain输出是n 1的元胞数组 内容为标签 0 或 1 LSTM层和options设置如下 layers sequen
  • Java-进制转换

    常用的进制转换 十进制转二进制 二进制转十进制 十进制转八进制 八进制转十进制 十进制转十六进制 十六进制转十进制 如果二 八 十六之间想转换可以通过十进制做中间者 import java util Scanner import java
  • 10本编程书籍推荐!带你从入门到精通

    在看书 阅读前 一定先选择一门适合自己的编程语言 对0基础的同学 选择程序设计语言时先了解自己的学习能力 太难的语言 没有一定的基础 以及没有老师讲解 指引 太容易产生挫败感从而放弃 其次 如果自己有一点点明确的目的或需求 那么选一门对自己
  • C++ Windows上键盘拦截

    键盘捕获代码 include
  • Java8 之Optional 的使用

    作为java8的新特性之一 可选在没有接触之前没有感受到过他的魅力 当真正的去用它才感觉到魅力之所在 可选 JAVA新增的工具类 主要是用来解决我们之前 NullPointException的问题 我先贴一段之前的代码 部分截取 真实业务场
  • 利用python开启简单http服务用户文件下载

    当文件传输没有工具时 利用python可以开启http服务 方便文件传输下载 python2 python m SimpleHTTPServer 2222 Serving HTTP on 0 0 0 0 port 2222 已经启动了端口为
  • ChatGPT专业应用:修改SQL为MySQL

    正文共 875 字 阅读大约需要 4 分钟 程序员等必备技巧 您将在4分钟后获得以下超能力 修改SQL为MySQL Beezy评级 A级 经过寻找和一段时间的学习 一部分人能掌握 主要提升效率并增强自身技能 推荐人 Kim 编辑者 Yola
  • STM32-按键输入

    1 硬件连接 1 1 mini 1 2 战舰 1 3 探索者 KEY0 gt PE4 上拉输入 KEY1 gt PE3 上拉输入 KEY2 gt PE2 上拉输入 WK UP gt PA0 下拉输入 按键输入最关键的是对按键的初始化和输入判
  • 数据结构小白之浅析二叉排序树(bst)

    1 什么是二叉排序树 二叉排序树 binary sort tree 简称为bst 是一种无论是查询还是添加都相对较快速的数据结构 相比于数组而言 未排序的数组 可以直接在数组的尾部进行添加数据 但是查找的速度慢 排序的数组 可以使用二分查找