概述
二叉树BSTs很容易实现,并且如果BSTs的键插入的顺序非常接近随机模型,那么BSTs能够提供快速搜索和插入。
很多程序开发者选用BSTs来实现symbol-table(键值对表),因为这样的实现支持快速的rank(查询第几位的值),select、delete、和范围查询操作。
但是,最坏的情况下,使用二叉树,其性能仍然是不能让人忍受的。基于二叉树的实现,好的性能是基于键基本满足随机的键,这样能保证树不可能包含太多的长的路径。
使用快速排序的时候,我们能够使随机化;但是使用一个symbole-table的API,我们没有这种自由,因为客户控制着混合操作。
实际上,二叉树最坏的情况不是不可能出现——当客户按照正向顺序或逆向顺序插入键(keys)的时候,最坏的情况就出现了。
剖析二分查询树
每个节点都有两个分叉;
左分叉上的节点值小于父节点的值,右分叉上的节点值大于父节点上的值;
从上往下将二分查询树的节点投影到一条线上,从左到右,节点的值依次增大;
任何一个节点x上,其元素的个数为: size(x)=size(x.left)+size(x.right)+1
一、基本的结构
public class BinarySearchTreeSymbolTable<Key extends Comparable<Key>, Value> {