数据结构:二叉数查找树基本实现(JAVA语言版)


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<k)
            return select(x.Right,k-t-1);
        else
            return x;
    }

  |说明:

      

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);
    }

  |说明:

    

      

数据结构:JAVA_二叉数查找树基本实现(中)的更多相关文章

  1. 数据结构:JAVA_二叉数查找树基本实现(上)

    数据结构:二叉数查找树基本实现(JAVA语言版) 1.写在前面 二叉查找树是一种能将链表插入的灵活性与有序数组查找的高效性结合在一起的一种数据结构. ..... 2.代码分解 2.1 对节点的结构定义 ...

  2. 二叉平衡查找树AvlTree(C实现)

    二叉平衡查找树即是一棵树中所有节点的左右子树高度差不超过1的查找树 头文件—————————————————————————————— #ifndef _AVLTREE_H_ #define _AVL ...

  3. C++实用数据结构:二叉索引树

    看下面这个问题(动态连续和查询): 有一个数组A(长度为n),要求进行两种操作: add(i,x):让Ai增大x: query(a,b):询问Aa+Aa+1+...+Ab的和: 若进行模拟,则每次qu ...

  4. 数据结构 之 二叉堆(Heap)

    注:本节主要讨论最大堆(最小堆同理). 一.堆的概念     堆,又称二叉堆.同二叉查找树一样,堆也有两个性质,即结构性和堆序性.     1.结构性质:     堆是一棵被完全填满的二叉树,有可能的 ...

  5. 【算法与数据结构】二叉搜索树的Java实现

    为了更加深入了解二叉搜索树,博主自己用Java写了个二叉搜索树,有兴趣的同学可以一起探讨探讨. 首先,二叉搜索树是啥?它有什么用呢? 二叉搜索树, 也称二叉排序树,它的每个节点的数据结构为1个父节点指 ...

  6. 高度平衡的二叉搜索树(AVL树)

    AVL树的基本概念 AVL树是一种高度平衡的(height balanced)二叉搜索树:对每一个结点x,x的左子树与右子树的高度差(平衡因子)至多为1. 有人也许要问:为什么要有AVL树呢?它有什么 ...

  7. 浅谈算法和数据结构: 七 二叉查找树 八 平衡查找树之2-3树 九 平衡查找树之红黑树 十 平衡查找树之B树

    http://www.cnblogs.com/yangecnu/p/Introduce-Binary-Search-Tree.html 前文介绍了符号表的两种实现,无序链表和有序数组,无序链表在插入的 ...

  8. (4) 二叉平衡树, AVL树

    1.为什么要有平衡二叉树? 上一节我们讲了一般的二叉查找树, 其期望深度为O(log2n), 其各操作的时间复杂度O(log2n)同时也是由此决定的.但是在某些情况下(如在插入的序列是有序的时候), ...

  9. D&amp;F学数据结构系列——二叉堆

    二叉堆(binary heap) 二叉堆数据结构是一种数组对象,它可以被视为一棵完全二叉树.同二叉查找树一样,堆也有两个性质,即结构性和堆序性.对于数组中任意位置i上的元素,其左儿子在位置2i上,右儿 ...

随机推荐

  1. mybatis: 利用多数据源实现分库存储

    之前写过一篇mybatis 使用经验小结 提到过多数据源的处理方式,虽然简单但是姿势不太优雅,今天介绍一些更美观的办法: spring中有一个AbstractRoutingDataSource的抽象类 ...

  2. 记录Office Add-in开发经验

    原创文章转载请注明出处:@协思, http://zeeman.cnblogs.com 得益于微软系强大的共通能力和Visual Studio的开发支持,做Office插件不是什么难事.一点经验记录如下 ...

  3. [译]AngularJS中DOM操作

    再翻译一篇干货短文,原文:AngularJS jQuery 虽然Angularjs将我们从DOM的操作中解放出来了,但是很多时候我们还是会需要在controller/view加载之后执行一些DOM操作 ...

  4. 【Python实战】Pandas:让你像写SQL一样做数据分析(二)

    1. 引言 前一篇介绍了Pandas实现简单的SQL操作,本篇中将主要介绍一些相对复杂一点的操作.为了方便后面实操,先给出一份简化版的设备统计数据: 0 android NLL 387546520 2 ...

  5. Excel转Json,Json转CSharp

    一份给策划最好的礼物!就是:Excel2Json2CSharp 策划配置Excel,动不动就要改数值啊,增加字段啊. 程序这边对应的解析类就得改动啊.整一个麻烦了得! 所以我就整理了这个Excel2J ...

  6. c#中方法的重载

    转自:http://www.cnblogs.com/lovesong_blog/articles/1416617.html string和program都是Object的派生类,string类型是se ...

  7. LoadRunner测试结果分析03 转载至zhangzhe的新浪博客

    LoadRunner测试结果分析之我见 前面分析的Web Resource(网络资源)的测试情况,其主要关注的是服务器性能,而系统本身和环境都有可能存在问题,页面诊断(Web Page Diagnos ...

  8. AutoMapper.EF6

    https://github.com/AutoMapper/AutoMapper.EF6 Extensions for AutoMapper and EF6 This contains some us ...

  9. NYOJ题目101两点距离

  10. ios学习笔记(二)第一个应用程序--Hello World

    原文地址:http://blog.csdn.net/shangyuan21/article/details/18416537 上一篇文章,Windows7上使用VMWare搭建iPhone开发环境介绍 ...