找出數字x的秩(小於或等於x的值的數目)

/**java

 * 功能:假設你正在讀取一串整數。每隔一段時間,你但願能找出數字x的秩(小於或等於x的值的數目)。app

 * 實現track(int x)方法,每讀入一個數字就會調用該方法;以及getRankOfNumber( int x)方法,返回值爲小於或等於x的元素個數(不包括x自己)。
 */



[java] view plain copythis

 

  1. /** 
  2.  * 思路:採用二叉查找樹 
  3.  * 執行中序遍歷,並在訪問結點時利用計數器記錄數量,找到x時,計數器變量將會是小於x的元素的數量。 
  4.  * 在查找期間,若是向左移動,計數器不會變,由於右邊跳過的全部指都比x大。 
  5.  * 向右移動時,跳過了左邊的一堆元素,所以必須增長計數器的值,這個值等於左子樹的元素個數。 
  6.  */  
  7. private static RankNode root=null;  
  8. public static void track(int number){  
  9.     if(root==null)  
  10.         root=new RankNode(number);  
  11.     else  
  12.         root.insert(number);  
  13. }  
  14.   
  15. public static int getRankOfNumber(int number){  
  16.     return root.getRank(number);  
  17. }  

[java] view plain copyspa

 

  1. class RankNode{  
  2.     int leftSize=0;  
  3.     RankNode left,right;  
  4.     int data=0;  
  5.     public RankNode(int d){  
  6.         this.data=d;  
  7.     }  
  8.       
  9.     public void insert(int d){  
  10.         if(d<=data){  
  11.             if(this.left==null)  
  12.                 left=new RankNode(d);  
  13.             else  
  14.                 left.insert(d);  
  15.         }else{  
  16.             if(this.right==null)  
  17.                 right=new RankNode(d);  
  18.             else  
  19.                 right.insert(d);  
  20.         }  
  21.     }  
  22.       
  23.     public int getRank(int d){  
  24.         if(d==this.data)  
  25.             return this.leftSize;  
  26.         else if(d<this.data){  
  27.             if(left==null)  
  28.                 return -1;  
  29.             else   
  30.                 return left.getRank(d);  
  31.         }else{  
  32.             if(right==null)  
  33.                 return -1;  
  34.             else  
  35.                 return this.leftSize+1+right.getRank(d);  
  36.         }  
  37.     }  
  38.       
相關文章
相關標籤/搜索