9.11排序与查找(八)——找出数字x的秩(小于或等于x的值的数目)

来源:互联网 发布:湖北大数据问责汇报 编辑:程序博客网 时间:2024/05/21 19:49
/**
 * 功能:假设你正在读取一串整数。每隔一段时间,你希望能找出数字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);elseroot.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);elseleft.insert(d);}else{if(this.right==null)right=new RankNode(d);elseright.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;elsereturn this.leftSize+1+right.getRank(d);}}}


0 0
原创粉丝点击