数据结构:JAVA_二叉数查找树基本实现(中)
数据结构:二叉数查找树基本实现(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_二叉数查找树基本实现(中)的更多相关文章
- 数据结构:JAVA_二叉数查找树基本实现(上)
数据结构:二叉数查找树基本实现(JAVA语言版) 1.写在前面 二叉查找树是一种能将链表插入的灵活性与有序数组查找的高效性结合在一起的一种数据结构. ..... 2.代码分解 2.1 对节点的结构定义 ...
- 二叉平衡查找树AvlTree(C实现)
二叉平衡查找树即是一棵树中所有节点的左右子树高度差不超过1的查找树 头文件—————————————————————————————— #ifndef _AVLTREE_H_ #define _AVL ...
- javascript 数据结构与算法---二叉数
二叉树,首先了解一些关于二叉数的概念(来自百度百科) 1. 二叉树(Binary tree)是树形结构的一个重要类型 2. 定义: 二叉树(binary tree)是指树中节点的度不大于2的有序树,它 ...
- 树-二叉搜索树-AVL树
树-二叉搜索树-AVL树 树 树的基本概念 节点的度:节点的儿子数 树的度:Max{节点的度} 节点的高度:节点到各叶节点的最大路径长度 树的高度:根节点的高度 节点的深度(层数):根节点到该节点的路 ...
- 用Python实现数据结构之二叉搜索树
二叉搜索树 二叉搜索树是一种特殊的二叉树,它的特点是: 对于任意一个节点p,存储在p的左子树的中的所有节点中的值都小于p中的值 对于任意一个节点p,存储在p的右子树的中的所有节点中的值都大于p中的值 ...
- 剑指offer-第四章解决面试题思路(二叉收索树和双向链表)
题目:输入一个二叉收索树,将二叉搜索树转换成排序的双向链表.要求不能创建节点,只能将链表中的指针进行改变. 将复杂的问题简单化:思路:二叉收索树,本身是一个排序结构,中序遍历二叉收索树就可以得到一组排 ...
- 数据结构-查找-二叉排序查找(平衡二叉树,B树,B+树概念)
0.为什么需要二叉排序树 1)数组存储方式: 优点:通过下标访问元素,速度快,对于有序数组,可以通过二分查找提高检索效率: 缺点:如果检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低: 2 ...
- C++实用数据结构:二叉索引树
看下面这个问题(动态连续和查询): 有一个数组A(长度为n),要求进行两种操作: add(i,x):让Ai增大x: query(a,b):询问Aa+Aa+1+...+Ab的和: 若进行模拟,则每次qu ...
- 数据结构 之 二叉堆(Heap)
注:本节主要讨论最大堆(最小堆同理). 一.堆的概念 堆,又称二叉堆.同二叉查找树一样,堆也有两个性质,即结构性和堆序性. 1.结构性质: 堆是一棵被完全填满的二叉树,有可能的 ...
随机推荐
- 用python2.7,采集新浪博客
#coding=utf-8 #新浪博客 import urllib import re import os url=['']*1500 #每一骗博客的地址 title=['']*1500 #每一篇博客 ...
- FreeRTOS任务栈
configTOTAL_HEAP_SIZE 定义堆大小,FreeRTOS 内核,用户动态内存申请,任务栈,任务创建,信号量创建,消息队列创建 等都需要用这个空间.
- zookeeper 的多线程和单线程库使用对比
zookeeper提供了两个库,zookeeper_st和 zookeeper_mt. 前者是单线程库,仅仅提供了异步API和集成在应用程序实现循环中的回调函数,这个库是为了支持pthread库不支持 ...
- go runtime.Gosched() 和 time.Sleep() 做协程切换
网上看到个问题: package main import ( "fmt" "time" ) func say(s string) { ; i < ; i+ ...
- 原生Ajax封装随笔
XMLHttpRequest 对象用于和服务器交换数据.我们使用 XMLHttpRequest 对象的 open() 和 send() 方法: open(method,url,async) metho ...
- Win7环境下搭建Go开发环境,基于VSCode编辑器
一.在搭建的时候参考以下文章 http://www.cnblogs.com/zsy/archive/2016/02/28/5223957.html http://blog.csdn.net/hil20 ...
- 【转】一个lucene的官网例子
创建索引: import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import jav ...
- openwrt-智能路由器hack技术(2)---"网路信息监控和窃取"
openwrt-智能路由器hack技术(2)---"网路信息监控和窃取" 1 导读 PS:之前写的一个文章,现在发现结构内容排版不是太好,导致阅读体验太差,影响传播和SEO,所 ...
- 如何通过自定义注解实现AOP切点定义
面向切面编程(Aspect Oriented Programming, AOP)是面向对象编程(Object Oriented Programming,OOP)的强大补充,通过横切面注入的方式引入其他 ...
- Angular实现递归指令 - Tree View
在层次数据结构展示中,树是一种极其常见的展现方式.比如系统中目录结构.企业组织结构.电子商务产品分类都是常见的树形结构数据. 这里我们采用Angular的方式来实现这类常见的tree view结构. ...