C++基于二叉树开发模板化CMap类

1.头文件

#pragma once
template<typename KEY, typename VALUE>
class CMap
{
	struct SNode
	{
		KEY key;
		VALUE value;
		SNode* pLeft, *pRight;
		SNode(KEY &key, VALUE &value) :key(key), value(value)
		{
			pLeft = pRight = nullptr;
		}
	};
	SNode* m_pRoot;
	int m_nCount;
public:
	void SetAt(KEY key, VALUE value);
	bool LookUp(KEY key, VALUE rValue) const;
	VALUE& operator[](KEY key);
	void RemoveAll(SNode* p);
	int GetCount() const
	{
		return m_nCount;
	}

	CMap();
	virtual ~CMap();
};

template<typename KEY, typename VALUE>
CMap<KEY, VALUE>::CMap():m_nCount(0)
{
	m_pRoot = nullptr;
}

template<typename KEY, typename VALUE>
CMap<KEY, VALUE>::~CMap()
{
	if (m_pRoot)
		RemoveAll(m_pRoot);
	m_pRoot = nullptr;
	m_nCount = 0;
}

template<typename KEY, typename VALUE>
void CMap<KEY, VALUE>::SetAt(KEY key, VALUE value)
{
	operator[](key) = value;
}

template<typename KEY, typename VALUE>
bool CMap<KEY, VALUE>::LookUp(KEY key, VALUE rValue) const
{
	SNode* p = m_pRoot;
	while (p)
	{
		if (key < p->key)
			p = p->pLeft;
		else if (key > p->key)
			p = p->pRight;
		else
		{
			rValue = p->value;
			return true;
		}
	}
	return false;
}

template<typename KEY, typename VALUE>
VALUE& CMap<KEY, VALUE>::operator[](KEY key)
{
	SNode* *p = &m_pRoot;
	while (*p)
	{
		if (key < (*p)->key)
			p = &((*p)->pLeft);
		else if (key >(*p)->key)
			p = &((*p)->pRight);
		else
			return (*p)->value;
	}
	*p = new SNode(key, VALUE());
	++m_nCount;
	return (*p)->value;
}

template<typename KEY, typename VALUE>
void CMap<KEY, VALUE>::RemoveAll(SNode* p)
{
	if (p->pLeft)
		RemoveAll(p->pLeft);
	if (p->pRight)
		RemoveAll(p->pRight);
	delete p;
	m_nCount = 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值