【数据结构】二分搜索树详解

2025-05-29 0 27

【数据结构】二分搜索树详解

一、结构

是一种很特别的数据结构这种数据结构叫做 “” 就是因为它 长得像一棵 。但是这棵画成的图长得却是一棵倒着的,根在上,叶在下。是图的一种,和图的区别就在于:是没有环的,而图是可以有环的。

状图是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做“”是因为它看起来像一棵倒挂的,也就是说它是根朝上,而叶朝下的。

【数据结构】二分搜索树详解

二、为什么要有结构

2.1 结构是一种天然的组织结构

比如说电脑中的文件夹,我们需要找到一个特定的文件,需要到某个文件夹下去找这个文件,计算机的文件存储的结构来源于生活。再比如说图书馆,我们知道图书馆里面有 历史类、数理类、计算机类,我们想要找到关于java的书籍,就需要到计算机类的Java中去找到我们需要的图书

【数据结构】二分搜索树详解

比如公司里面的层级结构:CEO、HR CTO等等,还有我们比较常见的家谱等等,都是类似于结构

【数据结构】二分搜索树详解

将数据使用结构后,会更加的高效

三、二分搜索

3.1 特点

  • 二分搜索是一个动态数据结构
  • 二分搜索也是一颗二叉树(也叫多叉)
  • 二分搜索的每个节点的值都大于其左子的所有节点的值,同时每个节点的值都小于其右子的所有节点的值
  • 存储的元素必须有可比较性, Java中的话就要求二分搜索保存的数据类型要实现Comparable接口, 或者使用额外的比较器实现
  • 每一颗子也是二分搜索
  • 二分搜索树具有唯一根节点,同时在二叉树中最底下是它的叶子节点

【数据结构】二分搜索树详解

  • 二分搜索具有唯根节点,每个节点最多有两个孩子(左边的叫左孩子,右边的叫右孩子),同时每个节点最多有一个父亲

二分搜索天然的具有递归特性

【数据结构】二分搜索树详解

二叉树不一定是满的,一个接电脑也是二叉树、空也是二叉树

【数据结构】二分搜索树详解

四、具体代码实现

在进行相关操作之前, 先定义一个支持泛型的节点类, 用于存储二分搜索每个节点的信息, 这个类作为二分搜索的一个内部类, 二分搜索的类声明以及Node节点类声明如下:

  1. publicclassBST>{
  2. privateclassNode{
  3. publicEe;
  4. publicNodeleft,right;
  5. publicNode(Ee){
  6. this.e=e;
  7. left=null;
  8. right=null;
  9. }
  10. }
  11. //节点
  12. privateNoderoot;
  13. //容量
  14. privateintsize;
  15. publicBST(){
  16. root=null;
  17. size=0;
  18. }
  19. publicintsize(){
  20. returnsize;
  21. }
  22. publicbooleanisEmpty(){
  23. returnsize==0;
  24. }
  25. }

4.1 添加元素

二分搜索添加元素的非递归写法,和链表很像,由于二分搜索本身的递归特性, 所以可以很方便的使用递归实现向二分搜索中添加元素,

【数据结构】二分搜索树详解

代码实现:

  1. //向二分搜索添加新的元素e
  2. publicvoidadd(Ee){
  3. root=add(root,e);
  4. }
  5. //向以Node为根的二分搜索中插入元素E,递归算法
  6. //返回插入新节点后二分搜索的根
  7. privateNodeadd(Nodenode,Ee){
  8. if(node==null){
  9. size++;
  10. returnnewNode(e);
  11. }
  12. if(e.compareTo(node.e)<0)
  13. node.left=add(node.left,e);
  14. elseif(e.compareTo(node.e)>0)
  15. node.right=add(node.right,e);
  16. returnnode;
  17. }

4.2 查找元素

由于二分搜索没有下标, 所以针对二分搜索的查找操作, 我们需要定义一个 contains() 方法, 查看二分搜索是否包含某个元素, 返回一个布尔型变量

代码实现:

  1. //看二分是搜索中是否包含元素e
  2. publicbooleancontains(Ee){
  3. returncontains(root,e);
  4. }
  5. //看以Node为根的二分搜索中是否包含元素e,递归算法
  6. privatebooleancontains(Nodenode,Ee){
  7. if(node==null)
  8. returnfalse;
  9. if(e.compareTo(node.e)==0)
  10. returntrue;
  11. elseif(e.compareTo(node.e)<0)
  12. returncontains(node.left,e);
  13. else//e.compareTo(node.e)>0
  14. returncontains(node.right,e);
  15. }

4.3 遍历操作

一、 什么是遍历操作

  • 遍历操作就是把所有的节点都访问一遍
  • 访问的原因和业务相关
  • 遍历分类

前序遍历 : 对当前节点的遍历在对左右孩子节点的遍历之前, 遍历顺序 : 当前节点->左孩子->右孩子中序遍历 : 对当前节点的遍历在对左右孩子节点的遍历中间, 遍历顺序 : 左孩子->当前节点->右孩子后序遍历 : 对当前节点的遍历在对左右孩子节点的遍历之后, 遍历顺序 : 左孩子->右孩子->当前节点

二、 前序遍历

  1. //二分搜索前序遍历
  2. publicvoidpreOrder(){
  3. preOrder(root);
  4. }
  5. //前序遍历以Node为根的二分搜索,递归算法
  6. privatevoidpreOrder(Nodenode){
  7. if(node==null)
  8. return;
  9. System.out.println(node.e);
  10. preOrder(node.left);
  11. preOrder(node.right);
  12. }
  13. publicvoidpreOrderNR(){
  14. Stackstack=newStack<>();
  15. stack.push(root);
  16. while(!stack.isEmpty()){
  17. Nodecur=stack.pop();
  18. System.out.println(cur.e);
  19. if(cur.right!=null)
  20. stack.push(cur.right);
  21. if(cur.left!=null)
  22. stack.push(cur.left);
  23. }
  24. }

三、 中序遍历

【数据结构】二分搜索树详解

  1. //二分搜索的中序遍历
  2. publicvoidinOrder(){
  3. inOrder(root);
  4. }
  5. //中序遍历以Node为根的二分搜索,递归算法
  6. privatevoidinOrder(Nodenode){
  7. if(node==null)
  8. return;
  9. inOrder(node.left);
  10. System.out.println(node.e);
  11. inOrder(node.right);
  12. }

四、 后序遍历

【数据结构】二分搜索树详解

  1. //二分搜索的后序遍历
  2. publicvoidpostOrder(){
  3. inOrder(root);
  4. }
  5. publicvoidlevelOrder(){
  6. Queueq=newLinkedList();
  7. q.add(root);
  8. while(!q.isEmpty()){
  9. Nodecur=q.remove();
  10. System.out.println(cur.e);
  11. if(cur.left!=null)
  12. q.add(cur.left);
  13. if(cur.right!=null)
  14. q.add(cur.right);
  15. }
  16. }
  17. //后序遍历以Node为根的二分搜索,递归算法
  18. privatevoidpostOrder(Nodenode){
  19. if(node==null)
  20. return;
  21. inOrder(node.left);
  22. inOrder(node.right);
  23. System.out.println(node.e);
  24. }

五、 理解前中后

【数据结构】二分搜索树详解

二分搜索前序非递归写法

【数据结构】二分搜索树详解

【数据结构】二分搜索树详解

原文链接:https://mp.weixin.qq.com/s/8xxuGiL0fhq_nH05avL5FA

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 【数据结构】二分搜索树详解 https://www.kuaiidc.com/94197.html

相关文章

发表评论
暂无评论