package com.interview.algorithms.array; /** * Created_By: stefanie * Date: 14-10-19 * Time: 下午6:19 */ public class C4_69_TrackNumberRank { class BinarySearchTreeNode{ int key; int count; int size; BinarySearchTreeNode(int key) { this.key = key; this.count = 1; this.size = 1; } BinarySearchTreeNode left; BinarySearchTreeNode right; } BinarySearchTreeNode root; public void track(int number){ root = add(root, number); } private BinarySearchTreeNode add(BinarySearchTreeNode node, int number){ if(node == null) return new BinarySearchTreeNode(number); if(node.key == number) { node.count++; } else if(node.key > number){ node.left = add(node.left, number); } else { node.right = add(node.right, number); } node.size++; return node; } public int rank(int number){ return rank(root, number); } private int rank(BinarySearchTreeNode node, int number){ if(node == null) return 0; else if(node.key == number) return node.left == null? 0 : node.left.size; else if(node.key > number) return rank(node.left, number); else return rank(node.right, number) + (node.left == null? 0 : node.left.size) + node.count; } }