查找树(二级)

树的查找,大家仔细看这个名词,看这个单词,叫查找树,查找树怎么理解,谁是动词谁是名词,主语是谁,那就是我要去查找这棵树,

查找是动词,树是宾语,你又可以理解这是个名词,树的名字叫查找树,树是主语,不是二叉树,不是三叉树,是查找树,是这样的,

有一种概念叫二叉查找树,他也叫二叉搜索树,查找搜索吧,那不是一个含义吗,但是他还叫二叉排序树,那查找和排序是两个

截然不同的内容,这个树怎么可能既是排序树又是查找树呢,两个原因,一个原因,查找是search,排序是sort,首字母都是S,

所以叫BST(binargy search tree),但是这个肯定不是最主要的原因,我们找一个以S开始的单词,多的去了,不能随便叫,

最主要这棵树既可以用来查找,并且他本身也是有序的,当往里面添加元素的话,它会自动变成有序的,按照某种规则来排列的,

我们这几个树都是二叉查找树,或者叫二叉排序树,大家看一下他们有什么特点,我来跟大家说一下,看这一个,首先它是一棵二叉树,

这个是不是根,然后左边所有的节点,都小于8,发现没,右边所有的元素都大于8,这是根,还是递归的定义,这又是一个根,

左子树小于根,右子树大于根,里面这个树根是4,左是4,右是7,是不是还是满足,然后10是根,左边没有,右边是他,那根是14,

这是13,左小于根,如果我们这个时候来了一个数,它是15,你觉得他应该加在哪儿,我们是不是可以加到这个位置,加个15,

这就叫二叉查找树,其他的也是的,7都小于7,都大于7,递归定义,3大于3,小于3,递归定义的,一直到叶子节点,这红色是不是

也是二叉查找树,为什么啊,根,右边全部大于A,根,右边全部大于B,实际上他也是一个二叉查找树,或者是一颗空树,

或者具有以下的性质

1. 如果他的左子树不为空,左子树的所有节点都小于根

2. 如果他的右子树所有的节点不为空,节点也都大于根节点,

3. 他的左右节点也是二叉排序树,是这么来的


这是我们所说的一个内容
注意;大家想一下,满足这个条件就怎么了,满足这个条件想一下,如果我们对于二叉树进行中序遍历,什么叫中序遍历,

先遍历左边的,先遍历小的,再遍历根,再遍历右边的,因为我们刚才是二叉树的特点,我们对他中序遍历,先左,再根,后右,

那一部分都是先左再根后右,二叉排序树得到的中序遍历得到的结果就是一个有序的数列,这是一个,他为什么叫做二叉排序树,

对他进行中序遍历他就是有序的,他为什么叫二叉查找树,当然了,大家想一下,我要在这里找一个树16,我要怎么找,肯定是要从

根开始吧,6小于8,右边就全部排除了,就不可能在这儿了,6再和3比,左边是不是又全部排除了,这个和二分法折半折半查找是不是

差不多啊,一下子就可以抛弃一半了,这是我们所说的一个内容,最终和6比,找到了,我们要找一个5怎么找,先和8比,小于8,再和3比,

再和6比,5是不是小于6啊,再和4比,大于4,再和右边找,右边有没有,没有,这说明什么,这说明不存在,所以查找的话,这棵树是怎么构建的,

大家想一下,我们最早讲二叉树的时候,我们是怎么来构建这棵树的,看下我的代码,我们的二叉树是不是一个一个节点连接起来的,

为什么,因为之前的二叉树没有规律,现在不用了,因为他已经有规律了,有规律了怎么办,我们以这棵树为例,我现在有一个值是9,

因为这棵树已经构建好了,我现在有个9,你给我加到这棵树里面,你只要把这棵树的根,同时这个8值给了,就可以把这个9加到指定的位置,

为什么,因为他是有特点的吗,因为他是有规律的,9和8比那应该是往右边放,他和10比应该往左边放,左边是空白的,那好,就是你了,

9是不是加到这儿了,这个二叉查找树就涉及到了如何添加,可以通过算法来添加的,如何查找,查找是不是相当于折半查找啊,

还有一个如何排序,中序遍历他就是有序的,还有一个如何更新,如何修改,我们先做一个如何删除,如何删除呢,这个删除和更新就稍微复杂

一点,一堆完整的算法,叫我们来实现这一个,比如我们要把这个10删除了,删除完之后还得要保证它是一棵二叉查找树,那我们怎么办,

你要是把10删除了,那8指向14不就行了,你8指向14,9怎么办啊,9加到这儿吗,这事怎么办,我把9移除了,9放到10这个位置,

9放到这儿,8连9,9再连14,他还是满足这个规律,但是他一共有多种情况,都是有完整的算法的,那更新的时候呢,我要把6更新成15,

哪能随便更新,你更新还叫二叉查找树吗,就不是了,对于二叉查找树来说,他有一套完整的实现算法,以及代码实现,这个问题该

怎么解决,这个完整问题解决思路,这是我们讲的二叉查找树和二叉排序树,二叉查找树的好处我已经跟大家说了,但是他有没有缺点,

有,怎么又缺点,比如说,我现在给了大家几个数,1,2,3,4,5,总共5个数,但是这个数我以不同的顺序来给,3,2,5,4,1,是不同的顺序,

我们按照不同的顺序来构建一个二叉查找树,先来一个3来做根了,它是第一个,那2怎么办,2应该放到这儿,5怎么办,5应该放到这儿,

再来一个4,4大于3小于5,再来个1,1是不是应该到这儿了,那这儿我如果再跟一个6呢,3,5,6,总体来看这棵树比较平均的,左右是不是

比较平衡的,左边的节点和右边的节点是不是差不多的,但是如果你是这么来给呢,1,2,3,4,5,6,按照这个顺序来给,那就变成什么样子了,

先来个1,再来个2,再来个3,再来个4,再来个5,再来个6,这哪还是二叉树啊,这纯粹就是一个线性表,你觉得是这种方式好,还是这种方式好,

哪种方式好啊,当然是这种方式好啊,比如说,我要查找6的话,每层数量就加倍,这个你相当于要找几次,相当于你在这种极端的情况下,

你要找一个数的话,时间复杂度是O(n),因为你一定是一个线性表的,花的时间是很多的,但是在这个里面呢,这个就相当于log2 n,

因为每次增倍,越往下就比上一层增加2,如果满的话,所以这个效率是可以大大提升的,虽然都是二叉查找树,都是左边小于根,根小于

右子树,但是如果排列规则不一样的话,这是一种极端的,完全平衡的,这是一种完全不平衡的,我们希望得到哪一种啊,我希望得到这一种,

为什么,这一种对什么有好处,对查找有好处,你添加的时候也好添加,这是一个
那我们在下边再讲一个名词,这个词叫平衡二叉树,平衡的


什么叫平衡二叉树?

他首先是一个二叉查找树,这什么意思啊,左边小于根,根小于右边,并且他还是平衡的,一般我们叫平衡,别人是自平衡的,是这么来的,

叫AVL树,所以称之为AVL算法,按照这个算法的叫AVL树,他怎么了,这就是一颗平衡二叉树,他为什么是一颗平衡二叉树啊,为什么他是

平衡的,这是一个根,右边分几层,右边两层吧,左边几层,左边3层,做多相差不能差一层,然后你还是递归的,这是一个根吧,左边几层,

左边两层,这是几层,1层,7又是根,左边几层,1层,右边几层啊,1层,左边右边,左子树右子树他们的高度之差最多差一层,那基本上就

相同了,最后一层有可能是不满的,可能是不满的,这就是循环二叉树,那这个平衡二叉树怎么办呢,他就可以保证每层的节点尽可能的

多一些,这样来说是比较平衡的,是比较平均的,不会一会特别多,一会特别少,最大的好处是什么啊,就是为了减少二叉查找树的层次,

平衡不就是每层节点多,层数就少了吗,他就不是可以避免出现这种情况的吗,这是我们所说的一个内容,从而来提高查找速度,

你告诉我上面的是不是二叉平衡树,这个是不是,你仔细看哦,这是几层,3层,这是3层,这是几层,1层,右边2层,根两层,2层,这个是不是,

根几层,3层,右子树3层,这没有问题,10左边0层,右边2层,不是二叉平衡树,怎么就是了,比如他把10写成13,本来是10,把10放到这儿,

如果这么一移的话,知道我们所说的一个意思,那你要这么来说的话,这个肯定不是平衡的,那是绝对不平衡的,那我们下边再来做一个操作吧,

[1,2,3,4,5,6],我就按照这个顺序给你,如果底层是一棵平衡树的话,这个该怎么来构建,第一个作为根,这是平衡的吧,

就一个节点,他左边是0,右边也是0,再加上一个2,平衡吗,为什么平衡,左边是0,右边是1高度,是平衡的,再加一个3,再加就不平衡了,

算法可以保证,它会自平衡,怎么就自平衡了,根不是1吗,我想拿2做根,怎么拿2做根啊,2的左孩子不是没有吗,让2的左孩子变成1,

把2的左孩子指向1,这部分就不存在了,然后这再加上一个3,然后他就又平衡了,那我们再加4呢,我们再这再加一个4,这树还是

平衡的,但是如果你要是再加一个5的话,又不平衡了,怎么办,大家如果感兴趣可以查询更多的资料来看一下,它是有一套完整解决

方案的,它会一直维持树的平衡,保证左右是平衡的,可以保证以后查询的效率,这是我们所说的,二叉平衡树有什么好处,

提高查询的速度,减少查询次数,是这么来的,二叉查找树的特点在于什么,它是有规律的,这么一来呢,我们不便于添加,

便于排序,是这么来的,而对于平衡二叉树来说,便于查找


再往下看,下一种树叫红黑树,红黑树什么意思啊,首先记住它也是一种平衡二叉树,有人说他也是一种平衡二叉树,我们前面不是也有

平衡二叉树吗,对啊,平衡二叉树你要是想实现这个,特点是固定的,左右平衡,但是实际上方案可以有很多种,实现方案保证他左右平衡的,

我们一般说的平衡二叉树呢,叫AVL算法,是这种算法来保证平衡的,但是后来又出现了一种算法,后来又出现一种算法叫红黑算法呗,

他也可以保证这棵树也是平衡的,那这就是一颗最简单的红黑树的模型图,首先我们看到他是平衡的,他把他的节点分别标记红色和黑色,

并且红色和黑色基本上都有交替出现

1. 比如每个节点不是黑色就是红色

2. 根节点第一个是黑色的

3. 每个叶子节点他保证是黑色的,但是你要知道他的叶子节点不是10,也不是50,而是他的空的左子树和空的右子树,

4. 这里面是这么来标记他的叶子节点的,总之它是通过一系列的规则来保证他最终的红黑树呢它是平衡的
红黑树的使用还是很广泛的,像我们JAVA里面的TreeSet,TreeMap底层采用的都是红黑树,底层采用的都是红黑树,这个大家要明白,

意味着我们JAVA里面的TreeSet是红黑树,这说明什么,大家想一下,第一个我们讲TreeSet,第一个它是有序的,是不是说过它是有序的,

他怎么成有序的了,你说TreeSet底层是红黑树就是有序的吗,对啊红黑树首先是一个查找树,对任何树进行中序遍历得到的就是有序了,

他就是这么来实现的,另外他既然是红黑树,不管我们按照什么顺序加这个数据,最终它会出现这个极端的情况吗,不会,所以我们红黑树

的查找效率,也是比较高的,多少啊,就是log2 n,就是我们说的一个平衡树,一种是最早的AVL树,还有一个叫红黑树,记住它是左右平衡的,

TreeSet使用的就是红黑树


我们再讲一个B树,B树叫什么意思,Balanced Tree,B就是这个单词呗Balanced,balanced什么意思,就是平衡,这个叫平衡树,上面这个

叫平衡二叉树,这有什么区别吗,有,这个是不是左右平衡了,但是他最多分两个叉,那我最多让他分三个叉或四个叉呢,这样行不行呢,

每个节点可以分更多的叉,你还是每个节点都平衡的,可以吗,可以的,这就叫平衡树,大家来看,这就叫一个平衡树,他最多分了3个叉,

他不是两个叉,是分了3个叉,那么同一层就可以存更多的数据了,同样的数据就可以有更少的层次了,他就可以有更少的层次了,

这个也是有的,B树他就叫平衡树,它是多叉的,多叉的他就可以降低树的深度,从而减少查询的次数,提高查询的效率,这个一般是

用在什么地方的,这个一般是用来读硬盘上数据的时候,比如读我们数据库里面的数据,索引的时候就可以用这个来做,比如硬盘

里面的数据特别多,我们不能一次性的读到内存里面,内存里面放不下,该怎么办,就可以按照这种方式来,读出一部分来,这是两个节点

的资料,读了这两个之后呢,比如我要读的是9,我要找9这个数,所有的数据不可能全部都读到内存里面,因为比较大,那我就采用这种

平衡树来存储,那我就先读这一层,或者先把这两层读出来,容量是比较少的,我找的是9,你不需要把所有的数据都读出来再找9,那效率

会比较低,我先把这两个读出来,9它是有序的,你看他还是保证左边小于中间,中间小于右边,还是满足我们刚才的规律的,

你看这是17,这是什么意思,这有两个数,下边有3个指针,我很奇怪,为什么两个数下面有3个指针啊,因为这个指针指向的是小于17的,

那这个指针指向的是大于35的,那中间这个指针指向的是17到35之间的,两个数正好把整个树分成3个区块,同样2个节点3个指针,

这边是小于8的,这边是大于12的,当然大于12是有要求的,那这个指针指向的是8到12中间的,那大家想一下,我想在这里面找9,

该怎么找,先和17比,小于17,那意味着什么啊,这一块,这一块一下子排除了,因为他是平衡的,所以他不是排除了二分之一,

他排除了三分之二,这边再来,拿着这个9和8进行比较,结果发现他大于8,大于8把8指向的排除了,然后再和12比,那不用说了,

那就是在这儿,9找到了,就这么来就可以了,这是我们所说的B树,他和我们的二叉平衡树的区别,B树首先是平衡的,

他只不过是分了更多的叉,然后呢我们再看另外一个
B+树:

B+树什么意思,B+树是这么来的,我们看上面的树,如果我想找17呢,如果我想找12呢,17是不是一下子就找到了,找12呢,是不是也能找到

找13是不是在这儿呢,就是我们找的数据啊,他可能在第一层,也可能在第二层,是不是也可能在第三层,各层都是有数据的,各层都有数据

那B+树他做了一下变化,他是怎么变的呢,他变成什么样子了,B+树的一个变化,他变成这个样子了,什么样子啊,我们画一条线,所有的数据

都在最下面一层,你看5,28,65,是不是也有啊,就是真正的数据全部都在下一层,我们之前是每一层都存数据的,现在不是了,现在是

所有的数据都放在这,都放在最下面这一层,我上面只是索引,上面的是索引,这是完整的索引数据,

这个时候怎么办呢,5,28,65,都对应指针的,5如果往左边走,那就是包括5的,因为这个5只是索引的数据,不是真正的数据,真正的数据在

这儿,有几个数就有几个指针,一一对应的,我们找一个数,我们找一个5,怎么找,5找到了没有,5,没找到,哪儿找到了,真正的数据在这儿呢,

按照P1这个指针,往下来走,还是5啊,再往下走,这个指针找到这儿,真正的数据它是在这儿,他在这儿已经找到5了,那他这个怎么办,

就在这儿不行吧,如果整个5代表一个学生的话,5要是代表一个学生的话,这个地方存的也许是一个完整的学生,而这儿存的可能是一个学生

的分数,或者学号啊,或者是年纪啊,这些排序的字段,是这么来的,这么就找到了,我们就再来找一个呗,再来找一个40吧,

告诉我40该怎么找,从上面的一级索引,2级索引,数据是不是在这儿呢,我要找的是40,怎么办,如果要是没有我们这个索引的话,怎么找啊,

是不是要逐个的查找啊,这个效率太低了吧,但是有了这个索引之后,最多也没有几次,为什么最多也没有几次,找40,先和5比,大于5,和28比,

大于28,和65比,小于65,那就按照P2来找就可以了,一下子把左边的排除了,一下子把右边的也排除了,再来找40,和28比,大于28,那就不用

考虑了,和35比,这下面都是大于35的,但是小于56了,那再和56比,小于56,这里显示的是35到56之间的,和35比,不是,和38比,不是,和

50比,不是,都已经大于40了,不用找了,干什么啊,不存在,所以他上面这几级啦,是可以快速给你分到分支的,可以排除大量数据,一下子跳过

大量的数据,提高效率,那到最后一块就变成线性查找,一个一个找,但是数据是比较少的,这就是我们所说的B+树,那么大家记住了,

我们后面马上就要学数据库,数据库的索引就是采用的B+树,数据库的索引就是采用的B+树,可以分多个叉,但是你发现这个叉级别都是一样

层次都是一样的,最后我们再来看一个树



B*树:

B*树两个再对比一下呗,你觉得这两个有什么区别,有区别吗,有什么区别吗,B*树的索引之间又相连了,这里面有没有啊,它是没有的,

它是B+树的变体,在B+树的非根和非叶子节点,除了第一层和最后一层,中间各层之间,兄弟之间,是可以有指针的,这就是我们给大家讲的

相关的查找树的相关观念



总结一下,我们一共讲了几个概念:

第一个叫二叉查找树,他有什么特点,左边小于根,根小于右边,他有什么好处,便于查找,便于排序,为什么还要出一个二叉平衡树,

一看这个就明白了,这是一个二叉查找树,但是左右不平衡,结果都变成了线性表了,查找特别低效,所以我们希望他左右平衡,

那我们要实现这个平衡二叉树,或者二叉平衡树,实现的方式有很多,比如AVL树,或者还有一种采用红黑算法实现的红黑树,

这三种都是二叉树,再往下就是B树,B+树,B*树,B树什么意思啊,B树就是分了多个叉,B+树呢,数据全部在最底层,B*树

是索引之间也可以有关联

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值