二叉平衡树之二叉树搜索树【咱们一起手动模拟实现】

news2024/11/30 14:28:23

目录

1、什么是二叉搜索树?

2、手动模拟二叉搜索树

2.1、整体代码 

2.2、查找数据

2.3、插入数据 

2.4、删除数据

3、性能分析


1、什么是二叉搜索树?

二叉搜索树也叫作二叉排序树,可以使一颗空树,也可以是具有以下性质的二叉树:

  • 若它的左子树不为空,则左子树的所节点的值都小于根节点的值
  • 若它的右子树不为空,则右子树的所节点的值都大于根节点的值
  • 它的左右子树也分别是二叉搜索树

举例:


2、手动模拟二叉搜索树

2.1、整体代码 


public class BinarySearchTree {

    static class TreeNode {
        public int val;
        public TreeNode left;
        public TreeNode right;

        public TreeNode(int val) {
            this.val = val;
        }
    }
    //搜索树的根
    public TreeNode root;

    /**
     * 查找key是否存在于二叉搜索树当中
     * @param key
     * @return 当前节点找到返回地址,否则返回null
     */
    public TreeNode search(int key) {
        


    }

    /**
     * 插入节点
     * @param key
     */
    public boolean insert(int key) {
     



    }

     /**
     * 删除节点
     * @param key
     */
    public void remove(int key) {
       


    }
}

2.2、查找数据

代码:

      /**
     * 查找key是否存在于二叉搜索树当中
     * @param key
     * @return 当前节点找到返回地址,否则返回null
     */
    public TreeNode search(int key) {
        TreeNode cur = root;
        while(cur != null) {
            if(cur.val > key) {
                cur = cur.left;
            } else if(cur.val < key) {
                cur = cur.right;
            } else {
                return cur;
            }
        }
        return null;
    }

2.3、插入数据 

  • 树为空,直接插入
  • 树不为空,按照查找逻辑确定插入位置,如下: 

代码:

   /**
     * 插入节点
     * @param key
     */
    public boolean insert(int key) {
        TreeNode node = new TreeNode(key);
        if(root == null) {
            root = node;
            return true;
        }
        TreeNode cur = root;
        TreeNode parent = null;
        while (cur != null) {
            if(cur.val < key) {
                parent = cur;
                cur = cur.right;
            } else if(cur.val > key) {
                parent = cur;
                cur = cur.left;
            } else {
                //相等,搜索树中,无法存放值相等的节点
                return false;
            }
        }
        //cur == null
        if(key > parent.val) {
            parent.right = node;
        } else {
            parent.left = node;
        }
        return true;
    }

2.4、删除数据

设待删除结点为 cur, 待删除结点的双亲结点为 parent
1. cur.left == null
  •  cur root,则 root = cur.right
  •  cur 不是 rootcur parent.left,则 parent.left = cur.right
  •  cur 不是 rootcur parent.right,则 parent.right = cur.right
2. cur.right == null
  •  cur root,则 root = cur.left
  •  cur 不是 rootcur parent.left,则 parent.left = cur.left
  •  cur 不是 rootcur parent.right,则 parent.right = cur.left
3. cur.left != null && cur.right != null
  • 需要使用替换法进行删除,即在它的右子树中寻找中序下的第一个结点(关键码最小),用它的值填补到被删除节点中,再来处理该结点的删除问题

代码: 

    /**
     * 删除节点
     * @param key
     */
    public void remove(int key) {
        TreeNode cur = root;
        TreeNode parent = null;
        while (cur != null) {
            if(cur.val < key) {
                parent = cur;
                cur = cur.right;
            } else if(cur.val > key) {
                cur = cur.left;
            } else {
                //该节点需要删除
                //1、cur.left == null
                if(cur.left == null) {
                    if(cur == root) {
                        root = cur.right;
                    } else if(cur == parent.left) {
                        parent.left = cur.right;
                    } else {
                        parent.right = cur.right;
                    }

                }//2、cur.right = null
                else if(cur.right == null) {
                    if(cur == root) {
                        root = cur.left;
                    } else if(cur == parent.left) {
                        parent.left = cur.left;
                    } else {
                        parent.right = cur.left;
                    }
                }
                //3、cur.left != null && cur.right != null
                else {
                    TreeNode targetParent = cur;
                    TreeNode target = cur.right;
                    //替换时,可以找左子树的最大值,也可以是右子树的最小值
                    //我这里是,左子树的最大值
                    while (target.left != null) {
                        targetParent = target;
                        target = target.left;
                    }
                    cur.val = target.val;

                    if(targetParent.left == target) {
                        targetParent.left = target.right;
                    } else {
                        targetParent.right = target.right;
                    }
                }
            }
        }
    }

3、性能分析

  • 插入操作和删除操作都会必须先查找,查找效率代表了二叉搜索树中各个操作的性能
  • 在二叉搜索树中,如果每个元素查找的概率相等,则二叉搜索树平均查找的长度是结点在二叉搜索树的深度的函数,即节点越多,比较的次数越多
  • 对于同一个关键码集合,若插入次序不同,就可能会得到结构不同的二叉搜索树,如下:

这时,最优情况下,二叉搜索树为完全二叉树,平均比较次数为logN

最差情况下,二叉搜索树退化为单支树,平均比较次数为N/2

好啦,我们下期见咯~~~【AVL树】

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaScript 高级 内存管理和闭包

这里写目录标题1. JavaScript内存管理2. 垃圾回收机制算法1. 引用计数算法2. 标记清除算法3. 闭包的概念理解4. 内存泄露5. 面试题1. JavaScript内存管理 不管什么样的编程语言&#xff0c;在代码的执行过程中都是需要给它分配内存的&#xff0c;不同的是某些编程语言需要我们…

基于融合C3SE+YOLOv5s的高精度二维码检测识别分析系统

在前面的系列博文中&#xff0c;我们尝试了在不同款的yolov5模型中加入不同的注意力机制来提升模型的性能&#xff0c;都有不错的表现效果&#xff0c;本文主要的目的是尝试将注意力机制融合集成进入原生的C3模块中来替换原生的C3模块来对比分析模型的检测性能&#xff0c;首先…

【精华】JVM调优学习

JVM 介绍 1. 什么是 JVM JVM 是 Java Virtual Machine&#xff08;Java 虚拟机&#xff09;的缩写。一台执行 Java 程序的机器。 2 .JAVA 语言的执行原理 计算机语言&#xff1a; 计算机能够直接执行的指令。这种指令和系统及硬件有关。 计算机高级语言&#xff1a; 在遵循…

模块化建筑全球市场分析

模块化市场分析 市场摘要 全球模块化建筑市场&#xff0c;预计从2019年的1199亿6千万美元&#xff0c;到2027年的1916亿2千万&#xff0c;以6.4%的年复合成长率成长。人口增加&#xff0c;快速城市化和基础设施发展投资增加是预测期内刺激市场增长的关键因素。模块化施工是最可…

【C进阶】第十三篇——指针详解

指针的基本概念 指针类型的参数和返回值 指针与数组 指针与const限定符 指针与结构体 指向指针的指针与指针数组 指向数组的指针与多维数组 函数类型和函数指针类型 不完全类型和复杂声明 指针的基本概念 堆栈有栈顶指针&#xff0c;队列有头指针和尾指针&#xff0c;…

C++ 图进阶系列之纵横对比 Bellman-Ford 和 Dijkstra 最短路径求解算法

1. 前言 因无向、无加权图的任意顶点之间的最短路径由顶点之间的边数决定&#xff0c;可以直接使用原始定义的广度优先搜索算法查找。 但是&#xff0c;无论是有向、还是无向&#xff0c;只要是加权图&#xff0c;最短路径长度的定义是&#xff1a;起点到终点之间所有路径中权…

第五十讲:神州路由器IPv6隧道的配置

目前IPv6隧道技术有ISATAP隧道、6to4隧道、IPv6 over MPL隧道等。 任务一&#xff1a;配置ISATAP隧道 实验拓扑图如下所示 配置要求&#xff1a;两台路由器ROUTERA和ROUTERB通过IPv4网络连接&#xff0c;要求在两台路由器上分别配置ISATAP隧道&#xff0c;实现两端IPv6主机PC…

回收租赁商城系统功能拆解05讲-供货商

回收租赁系统适用于物品回收、物品租赁、二手买卖交易等三大场景。 可以快速帮助企业搭建类似闲鱼回收/爱回收/爱租机/人人租等回收租赁商城。 回收租赁系统支持智能评估回收价格&#xff0c;后台调整最终回收价&#xff0c;用户同意回收后系统即刻放款&#xff0c;用户微信零…

2022年学习和实习总结——收获颇多(未完待续...)

0 序言 时间已经进入了2023年&#xff0c;今年将是属于我们这一届秋招的一年。回顾2022年的学习和实习历程&#xff0c;我觉得今年的收获还是不少的&#xff0c;甚至可以说是整个高等教育生涯中&#xff0c;收获最多的一年。 1 学习情况总结 1.1 读书和学习总结 原来…

【Linux】项目构建自动化工具——make和makefile

make 和 makefile1.背景2. 利用make和makefile简单编译一个源文件3.使用方法解释4.执行原理5.项目清理1.背景 &#xff08;1&#xff09;一个工程中的源文件不计数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;makefile定义了一系列的规则来指定&#xff…

智能驾驶视觉传感器测试:自动驾驶车辆如何进行传感器标定?

为什么要进行标定&#xff1f;一辆自动驾驶车辆会安装多个传感器&#xff0c;需要通过传感器标定来确定相互之间的坐标关系&#xff0c;从而将多个传感器数据整合为“一个传感器”。因此&#xff0c;准确的传感器标定是实现智能车辆多传感器感知和定位系统的先决条件。传感器标…

MXNet的Faster R-CNN(基于区域提议网络的实时目标检测)《6》

我们在看Faster R-CNN源码(MXNet版本)的时候&#xff0c;除了下面这些我们遇到的常见的参数解析 import argparse import ast parser argparse.ArgumentParser(descriptionDemonstrate a Faster R-CNN network,formatter_classargparse.ArgumentDefaultsHelpFormatter) parse…

【操作系统系统/Golang】实验5:磁盘调度(FCFS,SSTF,SCAN与循环SCAN)

1 实验问题描述设计程序模拟先来先服务FCFS&#xff0c;最短寻道时间优先SSTF&#xff0c;SCAN和循环SCAN算法&#xff08;对应其他参考书的LOOK和C-LOOK&#xff09;的工作过程。假设有trackNum个磁道号所组成的磁道访问序列&#xff0c;给定开始磁道号initTrackNum和磁头移动…

Java项目管理工具:Maven介绍

Maven 简介下载与环境配置Maven仓库仓库类型本地仓库配置简介 Maven ,一款跨平台的项目管理工具。它主要服务于基于 Java 平台的项目构建与依赖管理。即可以将项目的开发和管理过程抽象成一个项目对象模型(POM),开发人员只需要做一些简单的配置,Maven 便可自动完成项目构建…

HRNet源码阅读笔记(4),庞大的PoseHighResolutionNet模块-stage1

一、图和代码上一讲的图中&#xff0c;有stage1图例如下;关键是看pose_hrnet.py中PoseHighResolutionNet模块的forward函数相关部分如下&#xff1a;def forward(self, x):x self.conv1(x)x self.bn1(x)x self.relu(x)x self.conv2(x)x self.bn2(x)x self.relu(x)x self…

一辈子干好一件事,你就了不起

人生的道路和轨迹&#xff0c;就像是射出去的箭。假如左拐右拐&#xff0c;不但不能射中靶心&#xff0c;达不到目标&#xff0c;还有可能拐弯回到原点&#xff0c;原地踏步。日复一日&#xff0c;年复一年&#xff0c;没有成长和收获&#xff0c;这很可怕。 短暂的2022年&…

设计测试用例的万能公式 + 6大具体方法 = 面试就像聊天?

目录 一、设计测试用例的万能公式 二、设计测试用例的具体方法 2.1、等价类 2.2、边界值 2.3、判定表&#xff08;因果图的另一种形式&#xff09; 2.4、场景设计法 2.5、正交法&#xff08;用的少&#xff0c;基本不可见&#xff09; 2.4.1、使用allparis构建正交表 2.…

算法之动态规划理论

目录 前言 一个模型三个特征理论讲解 1.最优子结构 2.无后效性 3.重复子问题 一个模型三个特征实例剖析 两种动态规划解题思路总结 1.状态转移表法 2.状态转移方程法 四种算法思想比较分析 总结&#xff1a; 参考资料 前言 本篇博文主要讲解动态规划的理论&am…

行业分析| 交通综合执法对讲系统

随着社会的经济发展&#xff0c;人口的增加城市的不断壮大&#xff0c;城市交通情况越来越复杂&#xff0c;交警承担的执法任务越来越重&#xff0c;通信作为交警综合执法对讲调度的重要组成部分&#xff0c;也随之提出了更高的要求。综合执法对讲系统的出现使执法变得高效规范…

【Redis】高级进阶

&#x1f31f;个人博客&#xff1a;www.hellocode.top&#x1f31f; &#x1f31f;Java知识导航&#xff1a;Java-Navigate&#x1f31f; ⭐想获得更好的阅读体验请前往Java-Navigate &#x1f525;本文专栏&#xff1a;《流行框架》 &#x1f31e;如没有JavaWEB基础&#xff0…