struct BSTreeNode{
int val;
struct BSTreeNode *left;
struct BSTeeNode *right;
int count;
};
void BST_insert(struct BSTreeNode *root,struct BSTreeNode *p)
{
if(root->val>p->val)
{
root->count++;
if(root->left)
BST_insert(root->left,p);
else
root->left=p;
}
else if(p->val==root->val)
{
p->count+=root->count;
if(root->right)
BST_insert(root->right,p);
else
root->right=p;
}
else
{
p->count=root->count+1+p->count;
if(root->right)
BST_insert(root->right,p);
else
root->right=p;
}
}
void reverse(int *nums,int numsSize)
{
int i;
int len=numsSize;
for(i=0;i<(len/2);i++)
{
nums[i]=nums[i]+nums[len-i-1];
nums[len-i-1]=nums[i]-nums[len-i-1];
nums[i]=nums[i]-nums[len-i-1];
}
}
int* countSmaller(int* nums, int numsSize, int* returnSize) {
if(!numsSize)
{
*returnSize=0;
return NULL;
}
int *ret=malloc(sizeof(int)*numsSize);
memset(ret,0,sizeof(int)*numsSize);
reverse(nums,numsSize);
struct BSTreeNode *root=malloc(sizeof(struct BSTreeNode));
root->val=nums[0];
root->left=NULL;
root->right=NULL;
root->count=0;
for(int i=1;i<numsSize;i++)
{
struct BSTreeNode *p=malloc(sizeof(struct BSTreeNode));
p->val=nums[i];
p->left=NULL;
p->right=NULL;
p->count=0;
BST_insert(root,p);
ret[i]=p->count;
p->count=0;
}
reverse(ret,numsSize);
*returnSize=numsSize;
return ret;
}