二叉搜索树大冒险:寻找-插入-删除

OK,看我们题目就可知道啦,今天要分享学习的一种数据结构就是二叉搜索树。

内容题目也说了三个大概的,分别是寻找、插入、删除。

讲这个之前呢,那么就先讲讲这个二叉搜索树是何方神圣呢?

二叉搜索树:

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

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

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

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

示例如下:

OK,讲完了这个概念,那么接下来这个操作内容吧。

首先创建这个节点先

public class SearchTree {
    class TreeNode {
        public int val;
        public TreeNode left;
        public TreeNode right;
        public TreeNode(int val){
            this.val=val;
        }
    }
     public TreeNode root=null;
}

以及把这个节点初始一个变量root,置为null。

接下来,就写这个简单的方法——查找

查找

public TreeNode search(int key){
        TreeNode cur=root;
        while(cur!=null){
            if(cur.val<key){
                cur = cur.right;
            }
            else if(cur.val>key){
                cur=cur.left;
            }else{
                return cur;
            }
        }
        return null;
    }

思路:

让一个cur的节点帮我去走,因为root的左边比root小,右边比root大,所以当cur.val小于key时,说明key大往右走,否则往左走,都不是,即找到了,就可以返回当前节点的值了。

插入

先上代码

public void insert(int val){
        TreeNode node=new TreeNode(val);
        if(root==null){
            root=node;
            return;
        }
        TreeNode cur=root;
        TreeNode parent=null;

        while(cur!=null){
            if(cur.val>val){
                parent=cur;
                cur=cur.left;
            }else if(cur.val<val){
                parent=cur;
                cur=cur.right;
            }else{
                return;
            }
        }
        if(parent.val>val){
            parent.left=node;
        }else{
            parent.right=node;
        }
    }

思路:

先定义好一个Node节点,保存要插入的信息,然后再定义一个parent节点来保存上一个节点的信息,为什么呢?

因为这个总体思路就是要插入的节点的值比这个当前root节点的值进行比大小,大于root就往右走,小于往左走。

接着,再定义一个cur的节点,让它去走,当cur往左还是往右走时,parent都要走到当前cur的位置

当然,插入一个已有的值,可以选择return了,

当while循环走完,意味着走到了对的位置了

举个例子

插入一个2,那么这个cur就得往左走,走到1位置才是正确的,

然后parent也是到了cur的位置。

然后,当前的parent的值和当前val的值相比,大于就插入右边,小于就插入左边,

显然这个例子中,2插入1的右边。

最后一个内容。

删除

这里的删除有些麻烦,要分三种情况

第一种情况

删除的节点左边为空

举个例子

这个当左边为空时,也有三种状况。

第一种:当root为删除的节点时,让root=cur.right

第二种:当cur为根节点的左边时,图中为3,既让root=cur.right

第三种:当cur为根节点的右边时,图中为7,既让root=cur.right

而根据这里我们也可以写出第一部分的代码了

public void remove(int key){
        TreeNode parent=null;
        TreeNode cur=root;
        while(cur!=null){
            if(cur.val<key){
                parent=cur;
                cur=cur.right;
            }else if(cur.val>key){
                parent=cur;
                cur=cur.left;
            }else{
                removeNode(parent,cur);
            }
        }
    }
 private void removeNode(TreeNode parent,TreeNode cur){
         if(cur.left==null){
             if(cur==root){
                 root=cur.right;
             }else if(cur==parent.left){
                 parent.left=cur.right;
             }else {
                 parent.right=cur.right;
             }
}

代码解释:同样的,我们删掉节点之前,也先需要找到这个节点,删除节点的事让removeNode来做。

刚刚说明的root=cur.right中的root,当然是让一个parent来记录下来(即cur前面节点的信息)

第二种情况

即删除的节点右边为空

举个例子

同样的,这里也有三种情况

第一种:当删除的节点为根节点,所以root=cur.left

第二种:当删除的节点为root的左边,图中为3,所以root=cur.left

第三种:当删除的节点为root的右边,图中为7,所以root=cur.left

所以到这里也可以写一些代码了

 private void removeNode(TreeNode parent,TreeNode cur){
         if(cur.left==null){
             if(cur==root){
                 root=cur.right;
             }else if(cur==parent.left){
                 parent.left=cur.right;
             }else {
                 parent.right=cur.right;
             }
             }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;
                }

这个代码,跟第一种情况是类似的。

第三种情况

即删除的节点左右都不为空

目录

二叉搜索树:

查找

插入

删除

第一种情况

第二种情况

第三种情况

完!


举个例子

当我们要删除的节点为cur时,即图中的60,我们采用的方法是替换法,

即其一的办法是,在cur的右边找到其最小值替换掉cur,即图中的65替换掉60。

同理也可以找到cur的左边的最大值替换掉cur,

这样做是因为可以保持整棵树为一个二叉搜索树

具体这样子做(以在cur的右子树找最小值为例)

定义两个节点,一个是target,一个是targetParent。

其中,target=cur.right

targetParent=cur

让这个target去找到其最小值,找到了,再去赋值然后更新要修改的节点

修改完成后,再像其第一种情况中的当targetParent的左边为空时,让这个targetParent的左边指向

target的右边,相当于指向一个空指针,使其不再引用这个65的节点,达到删除效果

上代码

             TreeNode target=cur.right;
             TreeNode targetParent=cur;
             while(target !=null){
                 targetParent=target;
                 target =target.left;
             }
             cur.val=target.val;
             if(target ==targetParent.left){
                 targetParent.left=target .right;
             }else{
                 targetParent.right=target .right;
             }
         }

完!

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

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

相关文章

包成功安装tiny-cuda-nn,记录安装过程中的问题解决,附带pytorch3d安装【踩坑指南】

tiny-cuda-nn安装过程中的问题解决&#xff0c;附带pytorch3d安装【踩坑指南】 前言tiny-cuda-nn第一种下载方法&#xff1a;命令行安装tiny-cuda-nn第二种下载方法&#xff1a;本地编译 pytorch3d安装 前言 official repo: https://github.com/NVlabs/tiny-cuda-nn 该包可以显…

酷克数据亮相第13届PostgreSQL中国技术大会,获数据库杰出贡献奖

7 月 12 日&#xff0c;第 13 届 PostgreSQL 中国技术大会在杭州盛大开幕。本次大会以“聚焦云端创新&#xff0c;汇聚智慧共享”为主题&#xff0c;邀请了国内外 PG 领域众多行业大咖、学术精英及技术专家&#xff0c;共同探讨数据库领域的发展趋势、技术创新和实践经验。酷克…

计算机的错误计算(二十九)

摘要 &#xff08;1&#xff09;讨论近似值的错误数字个数。有时&#xff0c;遇到数字9或0, 不太好确认近似值的错误数字个数。&#xff08;2&#xff09;并进一步解释确认计算机的错误计算&#xff08;二十八&#xff09;中一个函数值的错误数字个数。 理论上&#xff0c;我…

《Python零基础入门》——关于PyCharm使用技巧及python基本概念

从本次文章开始&#xff0c;我们将学习一门新的编程语言——Python。作为最热门的编程语言&#xff0c;Python相对比较清晰、简单。 python主要的编译工具就是pycharm&#xff0c;关于pycharm的安装及python配置环境&#xff0c;大家可自行参考网络上的教程&#xff0c;本文不…

借人工智能之手,编织美妙歌词篇章

在音乐的领域中&#xff0c;歌词宛如璀璨的明珠&#xff0c;为旋律增添了无尽的魅力和情感深度。然而&#xff0c;对于许多创作者来说&#xff0c;编织出美妙动人的歌词并非易事。但如今&#xff0c;随着科技的飞速发展&#xff0c;人工智能为我们带来了全新的创作可能。 “妙…

【C++深度探索】全面解析多态性机制(二)

&#x1f525; 个人主页&#xff1a;大耳朵土土垚 &#x1f525; 所属专栏&#xff1a;C从入门至进阶 这里将会不定期更新有关C/C的内容&#xff0c;欢迎大家点赞&#xff0c;收藏&#xff0c;评论&#x1f973;&#x1f973;&#x1f389;&#x1f389;&#x1f389; 前言 我…

TEB局部路径规划算法代码及原理解读

TEB(Timed Elastic Band) 是一个基于图优化的局部路径规划算法&#xff0c;具有较好的动态避障能力&#xff0c;在ROS1/ROS2的导航框架中均被采用。该图优化以g2o优化框架实现&#xff0c;以机器人在各个离散时刻的位姿和离散时刻之间的时间间隔为顶点&#xff0c;约束其中的加…

MUR2060CTR-ASEMI无人机专用MUR2060CTR

编辑&#xff1a;ll MUR2060CTR-ASEMI无人机专用MUR2060CTR 型号&#xff1a;MUR2060CTR 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220 批号&#xff1a;最新 最大平均正向电流&#xff08;IF&#xff09;&#xff1a;20A 最大循环峰值反向电压&#xff08;VRRM&#…

tkinter-TinUI-xml实战(12)pip可视化管理器

引言 pip命令行工具在平常使用方面确实足够简单&#xff0c;本项目只是作为TinUI多界面开发的示例。 当然&#xff0c;总有人想用GUI版pip&#xff0c;实际上也有。不过现在&#xff0c;我们就来手搓一个基于python和TinUI&#xff08;tkinter&#xff09;的pip可视化管理器。…

线程控制

对线程的控制思路和进程相似&#xff0c;创建、等待、终止&#xff0c;只需要调用接口就行。但是在Linux下没有线程的概念&#xff0c;因为Linux的设计者认为&#xff0c;线程是一种轻量级的进程&#xff0c;毕竟创建线程只需要创建PCB。因此Linux中使用多线程必须使用第三方pt…

深入Linux:权限管理与常用命令详解

文章目录 ❤️Linux常用指令&#x1fa77;zip/unzip指令&#x1fa77;tar指令&#x1fa77;bc指令&#x1fa77;uname指令&#x1fa77;shutdown指令 ❤️shell命令以及原理❤️什么是 Shell 命令❤️Linux权限管理的概念❤️Linux权限管理&#x1fa77;文件访问者的分类&#…

深度学习中的FLOPs补充

学习了博主的介绍&#xff08;深度学习中的FLOPs介绍及计算(注意区分FLOPS)-CSDN博客&#xff09;后&#xff0c;对我不理解的内容做了一点补充。 链接放到下边啦 https://blog.csdn.net/qq_41834400/article/details/120283103 FLOPs&#xff1a;注意s小写&#xff0c;是floa…

车流量统计YOLOV8+DEEPSORT

车流量统计&#xff0c;YOLOV8NANODEEPSORT资源-CSDN文库 车流量统计YOLOV8DEEPSORT&#xff0c;目前支持PYTHON,C开发 PYTHON版本&#xff0c;需要YOLOV8&#xff0c;依赖PYTORCH C版本&#xff0c;只需要OPENCV

4K60无缝一体矩阵 HDMI2.0功能介绍

关于GF-HDMI0808S 4K60无缝一体矩阵的功能介绍&#xff0c;由于直接针对GF-HDMI0808S型号的具体信息较少&#xff0c;我将结合类似4K60无缝HDMI矩阵的一般功能特性和可能的GF-HDMI0808系列产品的特点来进行说明。请注意&#xff0c;以下信息可能不完全针对GF-HDMI0808S型号&…

【Vscode】显示多个文件 打开多个文件时实现标签栏多行显示

Vscode显示多个文件&VSCode打开多个文件时实现标签栏多行显示 写在最前面一、解决打开文件的时候只显示一个tab的办法解决办法如下&#xff1a; 二、文件标签栏多行显示设置步骤&#xff1a; &#x1f308;你好呀&#xff01;我是 是Yu欸 &#x1f30c; 2024每日百字篆刻时…

记录些Redis题集(3)

分布式锁 分布式锁是一种用于在分布式系统中实现互斥访问的机制&#xff0c;它可以确保在多个节点、或进程同时访问共享资源。如果没有适当的锁机制&#xff0c;就可能导致数据不一致或并发冲突的问题。 分布式锁需要的介质 需要一个多个微服务节点都能访问的存储介质&#…

实战演练-2021年电赛国一之三端口DC-DC变换器

文章目录 前言一、题目二、题目分析1、题目要求解析2、题目方案选定方案一(使用buck-boost电路&#xff0b;双向DC-DC电路&#xff08;前端&#xff09;)方案二(使用同步整流Boost升压电路&#xff0b;双向DC-DC电路&#xff08;前端&#xff09;)方案三(使用同步整流Boost升压…

打造你的智能家居指挥中心:基于STM32的多协议(zigbee、http)网关(附代码示例)

1. 项目概述 随着物联网技术的蓬勃发展&#xff0c;智能家居正逐步融入人们的日常生活。然而&#xff0c;市面上琳琅满目的智能家居设备通常采用不同的通信协议&#xff0c;导致不同品牌设备之间难以实现互联互通。为了解决这一难题&#xff0c;本文设计了一种基于STM32的多协…

我的AI音乐梦:ChatGPT帮我做专辑

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;AI篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来ChatGPT帮我做音乐专辑 嘿&#xff0c;朋友们&#xff01; 想象一下&#xff0c;如果有个超级聪明的机器人能帮你写…

【Unity学习笔记】第十九 · 物理引擎约束求解解惑(LCP,最优,拉格朗日乘数法,SI,PGS,基于冲量法)

转载请注明出处: https://blog.csdn.net/weixin_44013533/article/details/140309494 作者&#xff1a;CSDN|Ringleader| 在学习物理引擎过程中&#xff0c;有几大问题一直困扰着我&#xff1a; 约束求解到底是LCP还是带约束最优问题&#xff1f;约束求解过程中拉格朗日乘数法…