12.10 二叉搜索树与内部类
创始人
2024-04-21 07:22:22
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.匿名内部类

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...