您的位置:首页 > 理论基础 > 数据结构算法

读取一串整数,寻找合适的数据结构和算法,实现插入元素track(int x) 方法,以及GetRankOfNumber(int x)方法,返回值为小于等于x的元素个数(不包括x本身)

2014-11-19 11:53 615 查看
题目:《程序员面试金典(第5版)》P267

假如你正在读取一串整数。每隔一段时间,你希望能找出数字的秩(小于或等于x的值得数目,不包括x本身)。请实现数据结构和算法支持这些操作。也就是说,实现track(int x) 方法,每读入一个整数都会调用该方法;以及GetRankOfNumber(int x)方法,返回值为小于等于x的元素个数(不包括x本身)。

提示:采用二叉查找树实现该功能。二叉查找树(Binary Search Tree,BST)是一颗典型的二叉树,任何节点的键值大于等于该节点左子树中的所有键值,小于该节点右子树中的所有键值,并且每个节点域中有一个元素,记录该节点的左子树中所有节点的个数。

二叉查找树的实现如下代码所示:

class RankNode
{
public:
	int data;
	int left_size;
	RankNode* left,*right;

	RankNode(int n);
	//~RankNode();//遍历,全部delete
	void insert(int n);
	int GetRank(int d);
};

RankNode::RankNode(int n)
{
	data=n;
	left=nullptr;
	right=nullptr;
	left_size=0;
}

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

int RankNode::GetRank(int d)
{
	if(d==data)
		return left_size;
	else if(d<data)
	{
		if(left==nullptr)
			return -1;
		else
			return left->GetRank(d);
	}
	else
	{
		if(right==nullptr)
			return -1;
		else
		{
			int right_rank=right->GetRank(d);
			if(right_rank==-1)
				return -1;
			else
				return left_size+1+right_rank;
		}
	}
}
则本题目的解法如下:

class Question
{
public:
	RankNode *root;
	Question()
	{
		root=nullptr;
	}

	//遍历删除整个二叉查找树,避免内存泄露
	~Question()
	{
		if(root!=nullptr)
		{
			TraversalDelete(root->left);
			TraversalDelete(root->right);
			delete root;
			root=nullptr;
		}
	}
void track(int x)
{
	if(root==nullptr)
		root=new RankNode(x);
	else
		root->insert(x);
}

int GetRankOfNumber(int x)
{
	if(root==nullptr)
		return -1;
	else
		return root->GetRank(x);
}

void TraversalDelete(RankNode * h)
{
	if(h!=nullptr)
	{
		TraversalDelete(h->left);
		TraversalDelete(h->right);
		delete h;
		h=nullptr;
	}
}

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐