/*
总体思想:
可以通过构建二叉查找树来实现 因为数组倒置之后的元素逐个递归插入BST的过程中
*/
struct BSTNode{
int val;
int count;
BSTNode *left;
BSTNode *right;
BSTNode(int x) :val(x),count(0),left(NULL),right(NULL){};
};
class Solution {
public:
vector countSmaller(vector& nums) {
std::vector result;
std::vector count;
std::vector<BSTNode *> node_vec;
//倒置并初始化node_vec
for(int i = nums.size() - 1;i >= 0;i–){
node_vec.push_back(new BSTNode(nums[i]));
}
//初始化逆序数数组 因为第一个节点根节点是没有逆序数的
count.push_back(0);
//递归构建二叉树并记录逆序数
for(int i = 1;i < node_vec.size();i++){
int small_count = 0;
//实现没插入一个节点 就记录该节点的逆序数
BST_insert(node_vec[0],node_vec[i],small_count);
count.push_back(small_count);
}
//逆序删除节点 并记录结果
for(int i= node_vec.size() - 1; i >= 0;i–){
delete node_vec[i];
result.push_back(count[i]);
}
return result;
}
private:
void BST_insert(BSTNode *node,BSTNode *insert_node,int &small_count){
if(node ->val >= insert_node ->val){
//在数据结构中定义count 用于记录左子树中比根节点小的节点的个数
node ->count++;
if(node ->left){
BST_insert(node ->left,insert_node,small_count);
}else{
node -> left = insert_node;
}
}else{
//如果是右节点 会导致从第二个开始的后面的节点的逆序数在count的基础上加上1
small_count += node ->count + 1;
if(node ->right){
BST_insert(node -> right,insert_node,small_count);
}else{
node ->right = insert_node;
}
}
}
};