leetcode_二叉树与图_315. 计算右侧小于当前元素的个数_二叉查找树方法

/*
总体思想:
可以通过构建二叉查找树来实现 因为数组倒置之后的元素逐个递归插入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;
}
}
}
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

专一的黄先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值