/**
* 功能:假设你正在读取一串整数。每隔一段时间,你希望能找出数字x的秩(小于或等于x的值的数目)。
* 实现track(int x)方法,没读入一个数字就会调用该方法;以及getRankOfNumber( int x)方法,返回值为小于或等于x的元素个数(不包括x本身)。
*/
*/
/**
* 思路:采用二叉查找树
* 执行中序遍历,并在访问结点时利用计数器记录数量,找到x时,计数器变量将会是小于x的元素的数量。
* 在查找期间,如果向左移动,计数器不会变,因为右边跳过的所有指都比x大。
* 向右移动时,跳过了左边的一堆元素,因此必须增加计数器的值,这个值等于左子树的元素个数。
*/
private static RankNode root=null;
public static void track(int number){
if(root==null)
root=new RankNode(number);
else
root.insert(number);
}
public static int getRankOfNumber(int number){
return root.getRank(number);
}
class RankNode{
int leftSize=0;
RankNode left,right;
int data=0;
public RankNode(int d){
this.data=d;
}
public void insert(int d){
if(d<=data){
if(this.left==null)
left=new RankNode(d);
else
left.insert(d);
}else{
if(this.right==null)
right=new RankNode(d);
else
right.insert(d);
}
}
public int getRank(int d){
if(d==this.data)
return this.leftSize;
else if(d<this.data){
if(left==null)
return -1;
else
return left.getRank(d);
}else{
if(right==null)
return -1;
else
return this.leftSize+1+right.getRank(d);
}
}
}