10.10 数字流的秩

     《程序员面试金典》(第六版)习题:仅为记录一下以加强印象,不为商业用途,如有侵权请联系删除。以下源码和解释参考了书中源码以及解释。
     以下算法在不断读取数字流时不断进行 v o i d t r a c k ( i n t n u m b e r , R a n k N o d e ∗ r o o t ) void track(int number, RankNode *root) voidtrack(intnumber,RankNoderoot)操作来对已经读入的数创建一颗二叉搜索树,二叉搜索树中的每一个节点记录了当前树中该节点左子树中节点的个数(即当前节点的秩)。 i n t g e t R a n k O f N u m b e r ( i n t n u m b e r , R a n k N o d e ∗ r o o t ) int getRankOfNumber(int number, RankNode* root) intgetRankOfNumber(intnumber,RankNoderoot)操作在已经构建好的二叉搜索树中向左寻找某个已经存在于树中的节点(寻找的节点必须存在于二叉树中否则返回-1)的秩时,计数器的值不变,因为向左表明当前节点的值大于要寻找节点的值。当向右寻找时表明当前节点的值小于要寻找节点的值,计数器的值必须加上当前基点的秩,然后还要加一(要寻找的节点也大于当前节点本身)。递归操作直到找到需要寻找的节点为止。

class RankNode
{
public:
	int left_size;
	RankNode *left;
	RankNode *right;
	int data;
	RankNode(int d = 0)
	{
		left_size = 0;
		data = d;
		left= nullptr;
		right=nullptr;
	}

	void insert(int d)
	{
		if (d <= data)
		{
			if (left != nullptr)
			{
				left->insert(d);
			}
			else
			{
				left = new RankNode(d);
			}
			left_size++;
		}
		else {
			if (right != nullptr)
			{
				right->insert(d);
			}
			else
			{
				right = new RankNode(d);
			}
		}
	}

	int getRank(int d)
	{
		if (d == data)
		{
			return left_size;
		}
		else if (d < data)
		{
			if (left == nullptr)
			{
				return -1;
			}
			else 
			{
				return left->getRank(d);
			}
		}
		else
		{
			int right_rank = right == nullptr ? -1 : right->getRank(d);
			if (right_rank == -1)
			{
				return -1;
			}
			else
			{
				return left_size + 1 + right_rank;
			}
		}
	}
};

void track(int number, RankNode *root)
{
	if (root == nullptr) 
	{
		root = new RankNode(number);
	}
	else 
	{
		root->insert(number);
	}
}

int getRankOfNumber(int number, RankNode* root)
{
	return root->getRank(number);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

qqssss121dfd

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

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

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

打赏作者

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

抵扣说明:

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

余额充值