12.10 二叉搜索树与内部类

news2024/9/23 3:32:47

目录

一.二叉搜索树

1 概念

2 操作-查找

3.插入

4.删除(难点)

1.cur.left==null

2.cue.right==null

3.最复杂的情况 cur.left!=null&&cur.right!=null

6 性能分析

7 和 java 类集的关系

二.内部类

1.本地内部类

2.实例内部类

1.不可以定义静态 因为静态表示属于类 不属于对象的

2.如何实例内部类对象

3.如何继承内部类

4.出现与外部类同名的情况

3.静态内部类

1.可以定义静态成员

2.如何new

3.如何访问外部类成员

4.匿名内部类


一.二叉搜索树

1 概念

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

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

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

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

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

2 操作-查找

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

3.插入

跟查找原理类似,看跟val值大小比较.大往左走,小往右走,直到走到null了

.就可以插入,但是我们一定要知道他的父亲节点,所以我们需要定义一个后驱节点

public boolean insert(int val){
    if(root==null){
        Node root=new Node(val);
        return true;
    }
    Node pre=null;
    Node cur=root;
    while(cur!=null){
        pre=cur;
        if(cur.val>val){
            cur=cur.left;
        }else if(cur.val<val){
            cur=cur.right;
        }else{
            return false;
        }
    }//到这里就是找到对应要插入的父亲节点了
    Node node=new Node(val);
    if(pre.val>val){
        pre.left=node;
    }else{
        pre.right=node;
    }
    return true;
}

4.删除(难点)

分为多种情况 ,需要分类讨论

1.cur.left==null

直接让root指向cur.right

2.cue.right==null

跟左边是一样的

3.最复杂的情况 cur.left!=null&&cur.right!=null

是不能鲁莽直接删去.那他下面的子树怎么办

替换法

所以我们需要从他的右树找最小值或者从左子树找到最大值覆盖掉原来要删去的节点

并删去覆盖节点的原来位置

/**
 * 删除
 * @param val
 * @return
 */

public boolean remove(int val){
    if(root==null) return false;
    Node cur=root;
    Node parent=null;
    while(cur!=null){
        if(cur.val==val){
            remove1(parent,cur);
            return true;
        }else if(cur.val>val){
            parent=cur;
            cur=cur.left;
        }else{
            parent=cur;
            cur=cur.right;
        }
    }
    return false;
}
public void remove1(Node parent,Node cur){
    if(cur.left==null){
        if(cur==root){
            root=cur.right;
        }else if(cur==parent.left){
            parent.left=cur.right;
        }else if(cur==parent.right){
            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  if(cur==parent.right){
            parent.right=cur.left;
        }
    }else{
        //从左子树找到最大值
        Node ti =cur.left;
        Node tip=cur;
        while(ti.right!=null){
            tip=ti;
            ti=ti.right;
        }
        cur.val=ti.val;//他的右边是空的
        if(ti.left==null){
            //就是两边都是空的情况
            tip.right=null;
        }else{
            //左边不是空的情况
            tip.right=ti.left;
        }
    }
}

6 性能分析

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

对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度

的函数,即结点越深,则比较次数越多。

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

7 和 java 类集的关系

TreeMap 和 TreeSet 即 java 中利用搜索树实现的 Map 和 Set;实际上用的是红黑树,而红黑树是一棵近似平衡的

二叉搜索树,即在二叉搜索树的基础之上 + 颜色以及红黑树性质验证

二.内部类

1.本地内部类

作用域:当前方法

public class TestDemo {
    public  void test(){
        class test{
            int a;
        }
    }
}

2.实例内部类

在类里定义的一个类,根其他成员同级

可以看成外部类的一个普通实例方法

1.不可以定义静态 因为静态表示属于类 不属于对象的

因为调用实例内部类需要对象,但是static不需要对象.所以不可以交互

解决方法

定义静态常量\

2.如何实例内部类对象

引用内部类的成员,直接就是内部类名字.成员即可.不需要额外加外部类

Test1 test1=new Test1();
Test1.Test2 test2=test1.new Test2();//先创建对应的实例外部类对象,再用外部类来引用

3.如何继承内部类

4.出现与外部类同名的情况

对应的字节码文件

5.如果要访问外部的'

3.静态内部类

1.可以定义静态成员

与实例内部类的区别就是静态的

2.如何new

3.如何访问外部类成员

因为外部类成员调用直接由外部类.不依赖静态内部类

解决方法

1.new一个外部类来访问

4.匿名内部类

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

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

相关文章

踩坑记录1——RK3588编译OpenCV

这两天有在板卡上跑代码的需求&#xff0c;拿到了一块RK3588CPU的板子&#xff0c;型号是HINLINK的HK88. 以后记录一下调试这个板子的问题&#xff0c;便于以后查看 0. 基本信息 板卡系统&#xff1a;ArmBian&#xff0c;基于Ubuntu20.04 OpenCV版本&#xff1a;3.4.5 采用方法…

Java项目:SSM公司人力资源管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目为后台管理系统,分为管理员与普通员工两种角色&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登录,员工账号管理,部门管理,员工…

陆拾肆- 时序数据的特征化

一、前期大数据状况 进行客户域大数据运营时&#xff0c;一般是在当前状态计算客户的行为特征。 如会建立特征为 近7天是否有登录昨天是否有登录近7天销售情况点击主页后是否有点击下层页面哪个页面点击购买总浏览电子产品的次数占访问次数占比不进行商品浏览&#xff0c;只进…

Codeforces Round #772 (Div. 2) D. Infinite Set

翻译&#xff1a; 给定一个数组&#x1d44e;&#xff0c;该数组由&#x1d45b;个不同的正整数组成。 让我们考虑一个无限整数集&#x1d446;&#xff0c;它包含至少满足以下条件之一的所有整数&#x1d465;: 对于某些1≤&#x1d456;≤&#x1d45b;&#xff0c;&#…

微服务框架 SpringCloud微服务架构 微服务保护 33 授权规则 33.2 自定义异常结果

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 微服务保护 文章目录微服务框架微服务保护33 授权规则33.2 自定义异常结果33.2.1 自定义异常结果33.2.2 总结33 授权规则 33.2 自定义异常结…

十种类型电感概述

1、工字型电感 它的前身是挠线式贴片电感,工字型电感是它们的改良, 挡板有效加强储能能力,改变EMI方向和大小,亦可降低RDC。它亦可说是讯号通讯电感跟POWER电感的一种妥协。 工字型电感的缺点,仍是开磁路,有EMI的问题, 另外,噪音的问题比挠线式贴片电感大。 2、色环电感 色环电…

java计算机毕业设计ssm学生学习评价与分析系统8ql42(附源码、数据库)

java计算机毕业设计ssm学生学习评价与分析系统8ql42&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&…

C++11标准模板(STL)- 算法(std::set_union)

定义于头文件 <algorithm> 算法库提供大量用途的函数&#xff08;例如查找、排序、计数、操作&#xff09;&#xff0c;它们在元素范围上操作。注意范围定义为 [first, last) &#xff0c;其中 last 指代要查询或修改的最后元素的后一个元素。 数据结构的堆物理结构是数…

IOC 操作 Bean 管理( Bean 的生命周期)

生命周期 从对象创建到对象销毁的过程 Bean 的生命周期 通过构造器创建 Bean 实例&#xff08;无参构造&#xff09;为 Bean 的属性设置值和对其他 Bean 引用&#xff08;调用 set 方法&#xff09;调用 Bean 的初始化的方法&#xff08;需要进行配置&#xff09;Bean 可以使…

Java项目:SSM校园班级同学通讯录管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 管理员角色包含以下功能&#xff1a; 管理员登录,修改管理员资料,用户管理,公告管理,系别信息管理,班级管理,学生通讯录管理等功能。 用户角色包…

微信小程序框架(一)-全面详解(学习总结---从入门到深化)

目录 小程序与普通网页开发的区别 体验小程序 微信小程序账号申请 微信小程序开发者工具 下载安装 创建项目 开发者工具说明 小程序目录结构 描述整体的 app 描述各自页面的 page 全局配置_Pages Pages配置 entryPagePath 快捷生成页面方案 全局配置_window 常用属性…

太卷了,5年Java程序员竟答不出应届生字节二面?

11.22一面过 11.23二面挂 上一个部门寄了&#xff0c;给我换了个流程唉 一面 面试官问我&#xff0c;三面面评这么好为啥不继续了&#xff0c;我纳闷了&#xff0c;不是你们挂的我吗 介绍项目&#xff0c;点赞是怎么考量的&#xff0c;热度点赞问题怎么解决&#xff0c;具体…

【混合网络】

A Novel Adaptive Hybrid Fusion Network for Multiresolution Remote Sensing Images Classificatio &#xff08;一种新的自适应混合融合网络在多分辨率遥感图像分类中的应用&#xff09; 随着对地观测技术的快速发展&#xff0c;全色&#xff08;PAN&#xff09;和多光谱&…

【OpenCV-Python】教程:4-6 FAST (Features from Accelerated Segment Test)算法角点检测

OpenCV Python FAST&#xff08;Features from Accelerated Segment Test&#xff09; 算法角点检测 【目标】 理解FAST算法的理论基础&#xff1b;用OpenCV里的FAST 检测角点&#xff1b; 【理论】 我们看到了几个特征检测器&#xff0c;其中很多都非常好。但是从实时应用…

预训练语言模型

一、预训练 对于一个具有少量数据的任务 A&#xff0c;首先通过一个现有的大量数据搭建一个 CNN 模型 A&#xff0c;由于 CNN的浅层学到的特征通用性特别强&#xff0c;因此在搭建一个 CNN 模型 B&#xff0c;其中模型 B 的浅层参数使用模型 A 的浅层参数&#xff0c;模型 B 的…

Android Studio Dolphin logct日志台新版特性及老版本恢复

Android Studio Dolphin logct日志台新版特性及老版本恢复 日志台在此版本进行了更新&#xff0c;本文按官网描述简要汇总了其新特性和使用方法&#xff0c;以及老版本的日志如何恢复。 老版本日志台恢复 如果是习惯了老版本日志台的仁兄&#xff0c;可按下方截图操作进入Se…

IDEA安装ChatGPT插件步骤

首先感谢大佬的提供的插件【ChatGPT JetBrains插件完整版发布。让AI帮你写代码。-哔哩哔哩】 **前期准备&#xff1a;**需要注册OpenAI账号。不会的可以见我的教程&#xff1a;传送门 1、注册号账号后&#xff0c;打开网站https://chat.openai.com/api/auth/session 复制acess…

TS201的外部中断和定时终端控制FLAG输出(含参考源码)

硬件准备 ADZS-TS201S-EZLITE&#xff1a;ADI TS201开发板 AD-HP560ICE&#xff1a;ADI DSP专用仿真器 软件准备 Visual DSP软件 硬件链接 外部中断控制FLAG输出 原理就不讲了&#xff0c;前面几章都有说。 调试步骤: 1)打开VisualDSP&#xff0c;并新建一个工程文件&am…

C语言刷题系列——8.矩阵的行/列互换

&#x1f6a9;矩阵的行/列互换⛄一) 题目要求⛄二) 题解step1:输入矩阵step2:输入k(执行 行/列 互换操作的次数)step3:&#xff08;循环内部&#xff09;行/列互换step4:打印互换后的矩阵⛄三) 最终的实现⛄一) 题目要求 输入描述&#xff1a;第一行包含两个整数n和m&#xff…

基于pytest来演示一个PO测试模式案例

首先要说的是&#xff0c;这是一个很简易的案例&#xff0c;目的在于体会这样一种结构。 第一部分&#xff1a;基本操作 案例描述&#xff1a;启动浏览器--打开好123--点击logo--跳转到百度--输入搜索词汇--点击按钮开始搜索。 模式描述&#xff1a;这个模式把元素的提取、元…