博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构:二叉数查找树基本实现
阅读量:5956 次
发布时间:2019-06-19

本文共 1911 字,大约阅读时间需要 6 分钟。

1.写在前面

  二叉查找树得以广泛应用的一个重要原因是它能保持键的有序性,因此我们可以把它作为实现有序符号表API中的众多方法的基础。

  也就是说我们构建较为完整的二叉查找树API,为以后作为有序符号表提供基础。

  二叉查找树是高效的,灵活的。

  .....

2.代码分解

2.1 找到最大键和最小键

  既然是二叉查找树可以作为一个有序符号表,那么必然要提供获取最大键和最小键的功能。

public Key min()    {        return min(root).key;    }    private Node min(Node root)    {        if(root.Left==null)  //root.Right==null return 0            return root;            //return max(root.Right);        return min(root.Left);    }

  |说明:

    1.简要思路,根据二叉树的结构,我们知道,一个节点左边相连的节点一定是较小的,所以最小节点一定在从根节点开始一直往左走的位置,知道遇到一个节点的左节点是NULL,我们边返回这个左节点。

    2.递归的思路也比较简单,最大值的求法与最小值基本相同,注释已经标注。

 

2.2 向上取整和向下取整

public Key floor(Key key)    {        return floor(root,key).key;    }    private Node floor(Node root,Key key)    {        if(root==null)            return null;        int cmp = key.compareTo(root.key);        if(cmp==0)            return root;         if(cmp<0)            return  floor(root.Left,key);        Node t =floor(root.Right,key); //每次往右边走我们都需要记录一下,分析看说明        if(t!=null)            return t;        else            return root;    }

  |说明:

    

    由上图我们来分析一下思路,找G元素,先比较G元素与S元素,很显然G元素<S元素,那么我们需要往左边走,因为向下取整的数(简计为floor)一定是小于等于它自己的。到了E元素,很显然我们G是大于E的,此时,我们需要记录E,因为它右边的元素都大于E,后面的元素都可能会更接近G,但也有可能大于G,所以我们记录它。然后我们往右边走,..然后和R比,往左走,和H比往左走,此时发现G在H左侧的话是空值NULL,所以对于floor来说取E最好。

 

2.3 根据K值选择节点(返回排名为K的键)

public Key select(int k)    {        return select(root,k).key;    }    public Node select(Node x,int k)    {        //返回排名为K的节点        if(x==null)            return null;        int t =size(x.Left);          if(t>k)            return select(x.Left,k);        else if (t

  |说明:

      

 

2.4返回给定键的排名

public int rank(Key k){        return rank(k,root);    }    public int rank(Key k,Node x)    {        if(x==null)            return 0;        int cmp=k.compareTo(x.key);        if(cmp<0) return rank(k,x.Left);        else if(cmp>0) return 1+rank(k,x.Right)+size(x.Left);        else return size(x.Left);    }

转载地址:http://msexx.baihongyu.com/

你可能感兴趣的文章
利用dxflib读写cad文件
查看>>
服务器迁移小记
查看>>
FastDFS存储服务器部署
查看>>
Android — 创建和修改 Fragment 的方法及相关注意事项
查看>>
流程控制: jQ Deferred 与 ES6 Promise 使用新手向入坑!
查看>>
swift基础之_swift调用OC/OC调用swift
查看>>
Devexpress 15.1.8 Breaking Changes
查看>>
推荐JS插件:imagesLoaded,监测图片加载情况并提供相应的事件(加载成功/失败)...
查看>>
Java B2B2C多用户商城 springcloud架构- common-service 项目构建过程(七)
查看>>
杨老师课堂之ArrayList集合常用方法解析
查看>>
ElasticSearch Client详解
查看>>
新零售讲堂之时代下的传统零售业,何去何从?
查看>>
c++读取和写入TXT文件的整理
查看>>
深入动态人脸识别小场景应用,2019年或将迎来爆发期
查看>>
Ionic2 下处理 Android 设备下返回按钮的事件
查看>>
linux安全问答(1)
查看>>
zabbix监控进程的CPU和内存占用量
查看>>
【自用】手工编译lnmp环境
查看>>
普通用户通过Putty密钥方式登录
查看>>
网页显示3D模型
查看>>