12.10 二叉搜索树与内部类
创始人
2024-04-21 06:37:04
0

目录

一.二叉搜索树

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.valval){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.匿名内部类

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...