二叉搜索树的简单理解

1. 二叉搜索树

        二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:

若它的左子树不为空,则左子树上所有节点的值都小于根节点的值

若它的右子树不为空,则右子树上所有节点的值都大于根节点的值

它的左右子树也分别为二叉搜索树

        如下图所示,就是一个简单的二叉搜索树,且存储的数据为:

        int[] array ={5,3,4,1,7,8,2,6,0,9};

2. 二叉搜索树的实现

2.1 二叉搜索树的创建

        简单创建一个二叉树;

package binarysearchtree;

public class BinarySearchTree0 {
    static class TreeNode{
        public int value;
        public TreeNode left;
        public TreeNode right;

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

2.2 查找关键字key

        思路如下:

1、若根节点不为空:

        1.1如果根节点value==查找key,返回true

        1.2如果根节点value > 查找key,在其左子树查找

        1.3如果根节点value< 查找key,在其右子树查找,如果找不到,返回false

2、如果根节点为空,则返回false;以下为分析图解:

        代码实现:

 public TreeNode root ;//根节点
    public boolean findKey(int key){
        TreeNode cur = root;
        while (cur != null){
            if (cur.value == key){
                return true;
            }else if (key > cur.value){
                cur = cur.right;
            }else {
                cur = cur.left;
            }
        }
            return false;
    }

 2.3 插入关键字key的节点

        思路:

        插入操作可以分为以下两种情况:

  1. 如果树为空树,即根 == null,直接插入

        

        2.如果树不是空树,按照查找逻辑确定插入位置,插入新结点

        下图举个例子来分析:

        总体分析:

        1、先确定节点左右移动的方向 

  • 如果节点root.value==key,该值在搜索数中已经存在,无需插入,return flase;
  • 如果节点root.value>key,在其左子树找合适位置
  • 如果节点root.value<key,在其右子树找合适位置

        2、引入parent,该节点定义为与key值最后比较之后,接下来要进行插入节点操作的节点;

  • 如果节点parrent.value>key,新建key节点插在parent的左边
  • 如果节点parrent.value<key,新建key节点插在parent的右边

        代码如下图所示:

  public void insertkey(int key) {
        if(root == null) {
            root = new TreeNode(key);
            return;
        }
        TreeNode cur = root;
        TreeNode parent = null;
        while (cur != null) {
            if (key == cur.value) {
                return ;
            } else if (key < cur.value) {
                parent = cur;
                cur = cur.left;
            } else {
                parent = cur;
                cur = cur.right;
            }
        }
        TreeNode node = new TreeNode(key);
        if (key < parent.value) {
            parent.left = node;
        } else {
            parent.right = node;
        }
    }

 2.4删除关键字key

        假设要删除的结点为 cur, 待删除结点的双亲结点为 parent,我们分以下四种情况来分析:

        1. cur.left == null

        1.1 cur 是 root ,则 root = cur.right(图解如下)

         

        1.2 cur 不是 root,cur 是 parent.left,则 parent.left = cur.right

               

        1.3 cur 不是 root,cur 是 parent.right,则 parent.right = cur.right

                     

        2. cur.right == null(下面的三种情况与1截然相反,此处略)
        2.1  cur 是 root ,则 root = cur.left
        2.2  cur 不是 root , cur 是 parent.left ,则 parent.left = cur.left
        2.3  cur 不是 root , cur 是 parent.right ,则 parent.right = cur.left

        3. cur.left != null && cur.right != null

        思路:

我们使用target来遍历寻找子树中关键节点,targetParent用来记录target的父亲节点

找到相应节点后与待删除的cur节点的值进行替换,最后删除target结点即可

        详细的图解思路如下所示:

 

        4.cur左右孩子均不存在

        直接置为null;

        综上所述,代码实现:

    public void remove(int val) {
        TreeNode cur = root;
        TreeNode parent = null;
        while (cur != null) {
            if (val == cur.val) {
                removeNode(parent, cur);
                break;
            } else if (val < cur.val) {
                parent = cur;
                cur = cur.left;
            } else {
                parent = cur;
                cur = cur.right;
            }
        }
    }
 
    private void removeNode(TreeNode parent, TreeNode cur) {
        if (cur.left==null){
            if(cur==root){
                root=cur.right;
            }else if(parent.left==cur){
                parent.left=cur.right;
            }else{
                parent.right=cur.right;
            }
        } else if (cur.right==null) {
            if(cur==root){
                root=cur.left;
            }else if(parent.left==cur){
                parent.left=cur.left;
            }else{
                parent.right=cur.left;
            }
        }else{
            TreeNode target = cur.right;
            TreeNode targetParent = cur;
            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. 二叉搜索树性能分析

        插入和删除操作都必须先查找,查找效率代表了二叉搜索树中各个操作的性能。

        对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度的函数,即结点越深,则比较次数越多。

        但对于同一个关键码集合,如果各关键码插入的次序不同,可能得到不同结构的二叉搜索树:

        最优情况下,二叉搜索树为完全二叉树,其平均比较次数为:log (2^n)

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

ps:二叉搜索树的内容就到这里了,大家喜欢的话就请一键三连哦!!!

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

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

相关文章

接口测试总结及其用例设计方法整理

接口测试的总结文档 第一部分&#xff1a;主要从问题出发&#xff0c;引入接口测试的相关内容并与前端测试进行简单对比&#xff0c;总结两者之前的区别与联系。但该部分只交代了怎么做和如何做&#xff1f;并没有解释为什么要做&#xff1f; 第二部分&#xff1a;主要介绍为什…

A good teacher is patient and consistent(CVPR 2022)论文解读

paper&#xff1a;Knowledge distillation: A good teacher is patient and consistent official implementation&#xff1a;https://github.com/google-research/big_vision 本文的创新点 本文没有提出新的方法&#xff0c;而是提出了一些影响蒸馏性能的关键因素&#xff…

论文润色突显研究亮点 papergpt

大家好&#xff0c;今天来聊聊论文润色突显研究亮点&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff1a; 标题&#xff1a;论文润色突显研究亮点――提升论文吸引力的关键步骤 一、引言 在学术研究中&#x…

家政服务小程序预约上门,让服务更便捷

随着人们生活节奏的加快&#xff0c;家政服务行业越来越受到人们的欢迎。为了满足市场需求&#xff0c;提高服务质量&#xff0c;家政公司需要开发一款预约上门的家政服务小程序。本文将详细介绍如何制作一个预约上门的家政服务小程序。 一、登录乔拓云网后台 首先&#xff0c…

什么是接口与API接口!

今天有个朋友问我什么接口&#xff1f;你们平时都说在写接口&#xff0c;写的是什么鬼啊&#xff1f;我一开始就想&#xff0c;咦小陈同学怎么突然了解编程接口了&#xff0c;不过听到他后一个提问我知道原来他想的是API接口&#xff0c;不过被我主观意识习惯想成了编程定义上的…

DHCP--自动获取IP地址

目录 一、了解DHCP服务 1、概念 2、使用DHCP的好处 3、DHCP的分配方式 二、DHCP的租约过程 1、客户机请求IP地址 2、服务器响应 3、客户机选择IP地址 4、服务器确定租约 5、服务器租约期限到了之后续期问题 6、总结 三、部署DHCP实验 1、项目要求 2、规划设计 …

Linux服务器配置免密SSH

在当今互联网时代&#xff0c;远程工作和网络安全已成为信息技术领域的热点话题。无论是管理远程服务器、维护网络设备还是简单地从家中连接到办公室&#xff0c;安全始终是首要考虑的因素。这就是为什么 SSH&#xff08;Secure Shell&#xff09;成为了网络专业人士的首选工具…

【送书活动五期】Go语言开发规范指南

今天和一个小伙伴偶尔聊了两句&#xff0c;聊到现在工作的开发语言&#xff0c;大学时接触的第一个语言应该是html&#xff0c;系统且简单的学习了前端语言&#xff0c;之后伴随着学校的课程&#xff0c;C、C#、Java都有涉及&#xff0c;然后就一直已Java为主了&#xff0c;也是…

动手学深度学习-注意力机制

10.1注意力提示 自主性注意力机制 有意识的注意力机制。非自主性注意力机制 无意识的注意力机制。 小结: 人类的注意力是有限的&#xff0c;有价值和稀缺的资源。受试者使用非自主性和自主性提示有选择的引导注意力&#xff0c;前者基于突出性&#xff0c;后者则依赖于意识。…

浏览器js中添加日志断点

一、需求 本地调试时&#xff0c;可以直接代码里使用console.log直接调试&#xff1b; 代码已更新到服务器&#xff0c;不想要提交代码&#xff0c;如何通过添加console.log调试呢 二、实现 使用浏览器添加日志断点的方式&#xff0c;当然vue这种打包的不可行哦 设置完成后…

【深度学习】AlexNet网络实现猫狗分类

【深度学习】AlexNet网络实现猫狗分类 AlexNet简介 AlexNet是一种卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;模型&#xff0c;它在2012年的ImageNet图像分类挑战赛中取得了重大突破&#xff0c;引发了深度学习在计算机视觉领域的热潮…

严世芸龟法养生经

文章目录 严世芸理念荤素搭配&#xff0c;不偏嗜动静结合心平气和 龟息法 严世芸 严世芸&#xff0c;出生于1940年&#xff0c;现任上海中医药大学的主任医师&#xff0c;教授。他父亲是近代上海有名的中医&#xff0c;他又是著名医家张伯臾的亲传弟子。 从小就在父亲诊室里长…

阿里云国际版CDN网页打不开、页面报错该如何解决?

如果在使用CDN过程中&#xff0c;遇到了网页打不开、页面报错等问题时&#xff0c;您可以通过自助诊断工具来进行诊断。诊断工具会告知本次诊断结果&#xff0c;您可以根据结果来调整CDN配置或提交工单进行咨询。 使用场景 主要支持以下情况&#xff1a; 域名访问异常&#x…

后端idea提交代码到主分支

1.先从本地提交到远程本地orgin:保留一份&#xff0c;避免后面提交出错&#xff0c;无法回退 2.提取主分支代码&#xff1a;更新比人提交的部分&#xff1b;右击项目-》git-》提取 3.把主分支代码合并到本地中&#xff1a;避免最后推送起冲突 4.最后提交代码&#xff1a;推…

JVM第10章-前端编译与优化

Javac编译器 从Javac代码的总体结构来看&#xff0c;编译过程大致可以分为1个准备过程和3个处理过程 1&#xff09;准备过程&#xff1a;初始化插入式注解处理器。 2&#xff09;解析与填充符号表过程&#xff0c;包括&#xff1a; 词法、语法分析。将源代码的字符流转变为标记…

云计算与大数据技术应用知识及案列

云计算与大数据技术应用知识及案列 简述什么是云计算&#xff1f; 答&#xff1a;云计算是一种动态扩展的计算模式&#xff0c;通过网络将虚拟化的资源作为服务提供&#xff1b;云计算是一种无处不在的、便捷的通过互联网访问一个可定制的IT资源&#xff08;IT资源包括网络、服…

c/c++ 文件操作(2)

文件操作读和写 顺序读写 1、fgetc、fputc 函数功能fgetc字符输入函数----->对应打开方式是 “r”fputc字符输出函数-----> 对应打开方式是 “w” 2、fgets、fputs 函数功能fgets文本行输入函数------> 对应打开方式是"r"fputs文本行输出函数------>…

mybatis动态SQL-foreach

1、建库建表 create database mybatis-example; use mybatis-example; create table emp (empNo varchar(40),empName varchar(100),sal int,deptno varchar(10) ); insert into emp values(e001,张三,8000,d001); insert into emp values(e002,李四,9000,d001); insert into…

SD-WAN解决外贸企业网络问题

为了获取全球客户&#xff0c;占领更多的市场&#xff0c;越来越多的外贸企业出现。外贸企业在发展业务的过程中会遇到很多困难&#xff0c;海外网络访问问题就是其中之一。目前该问题主要有三种解决方案&#xff1a;VPN、MPLS专线以及SD-WAN专线。 VPN通过在公网上面建立专用网…

windows 服务器 怎么部署python 程序

一、要在 Windows 服务器上部署 Python 程序&#xff0c;您需要遵循以下步骤&#xff1a; 安装 Python&#xff1a;首先&#xff0c;在 Windows 服务器上安装 Python。您可以从官方网站&#xff08;https://www.python.org/downloads/windows/&#xff09;下载最新的 Python 安…