/**
* 功能:假设你正在读取一串整数。每隔一段时间,你希望能找出数字x的秩(小于或等于x的值的数目)。
* 实现track(int x)方法,每读入一个数字就会调用该方法;以及getRankOfNumber( int x)方法,返回值为小于或等于x的元素个数(不包括x本身)。 */
[java]
- /**
- * 思路:采用二叉查找树
- * 执行中序遍历,并在访问结点时利用计数器记录数量,找到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);
- }
[java]
- 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);
- }
- }
- }