Kód BVS strom v CPP

Z CHWiki

Přejít na: navigace, hledání
#ifndef __BINARY_SEARCH_TREE_H__
#define __BINARY_SEARCH_TREE_H__

template <typename T>
class CBinarySearchTree
{
	class CBinarySearchTreeNode
	{
	public:
		CBinarySearchTreeNode(T tKey = (T)NULL)
		{
			m_tKey = tKey;
			m_pLeft = m_pRight = NULL;
		}
		~CBinarySearchTreeNode()
		{
			SAFE_DELETE(m_pLeft)
			SAFE_DELETE(m_pRight)
		}

	protected:
		// node key
		T m_tKey;

		// children
		CBinarySearchTreeNode * m_pLeft;
		CBinarySearchTreeNode * m_pRight;

	public:
		inline CBinarySearchTreeNode ** GetLeft() {return &m_pLeft;}
		inline void SetLeft(CBinarySearchTreeNode * pLeft) {m_pLeft = pLeft;}

		inline CBinarySearchTreeNode ** GetRight() {return &m_pRight;}
		inline void SetRight(CBinarySearchTreeNode * pRight) {m_pRight = pRight;}

		inline T GetKey() {return m_tKey;}
		inline void SetKey(T tKey) {m_tKey = tKey;}

		inline void Print() {printf("%d,", m_tKey);}
	};

public:
	CBinarySearchTree()
	{
		m_pRoot = NULL;
	}
	~CBinarySearchTree()
	{
		SAFE_DELETE(m_pRoot);
	}

protected:
	// root node
	CBinarySearchTreeNode * m_pRoot;

public:
	inline CBinarySearchTreeNode * Insert(T tKey) {return Insert(&m_pRoot, tKey);}
	inline CBinarySearchTreeNode * Remove(T tKey) {return Remove(&m_pRoot, tKey);}
	inline CBinarySearchTreeNode * Search(T tKey) {return Search(m_pRoot, tKey);}
	inline CBinarySearchTreeNode * GetMaximum() {return GetMaximum(m_pRoot);}

	inline void DoInOrder() {DoInOrder(m_pRoot);}
	inline void DoPreOrder() {DoPreOrder(m_pRoot);}
	inline void DoPostOrder() {DoPostOrder(m_pRoot);}

protected:
	CBinarySearchTreeNode * Insert(CBinarySearchTreeNode ** ppRoot, T tKey)
	{
		if((*ppRoot) == NULL)
		{
			(*ppRoot) = new CBinarySearchTreeNode(tKey);
			return *ppRoot;
		}
		else if(tKey < (*ppRoot)->GetKey())
		{
			return Insert((*ppRoot)->GetLeft(), tKey);
		}
		else if(tKey > (*ppRoot)->GetKey())
		{
			return Insert((*ppRoot)->GetRight(), tKey);
		}
		else
		{
			return *ppRoot;
		}
	}
	CBinarySearchTreeNode * Remove(CBinarySearchTreeNode ** ppRoot, T tKey)
	{
		CBinarySearchTreeNode * pNode = NULL;
		CBinarySearchTreeNode * pMaxNode = NULL;
		T tTmp;

		if((*ppRoot) == NULL)
		{
			return *ppRoot;
		}
		else if(tKey < ((*ppRoot)->GetKey()))
		{
			return Remove((*ppRoot)->GetLeft(), tKey);
		}
		else if(tKey > ((*ppRoot)->GetKey()))
		{
			return Remove((*ppRoot)->GetRight(), tKey);
		}
		else
		{
			pNode = *ppRoot;

			if(*((*ppRoot)->GetLeft()) == NULL)
			{
				*ppRoot = *(*ppRoot)->GetRight();
			}
			else if(*((*ppRoot)->GetRight()) == NULL)
			{
				*ppRoot = *(*ppRoot)->GetLeft();
			}
			else
			{
				pMaxNode = Remove(ppRoot, GetMaximum(*ppRoot)->GetKey());

				tTmp = pMaxNode->GetKey();
				pMaxNode->SetKey(pNode->GetKey());
				pNode->SetKey(tTmp);

				pNode = pMaxNode;
			}

			pNode->SetLeft(NULL);
			pNode->SetRight(NULL);
			return pNode;
		}
	}
	CBinarySearchTreeNode * Search(CBinarySearchTreeNode * pRoot, T tKey)
	{
		if(pRoot == NULL)
		{
			return NULL;
		}
		else if(tKey < pRoot->GetKey())
		{
			return Search(pRoot->GetLeft(), tKey);
		}
		else if(tKey > pRoot->GetKey())
		{
			return Search(pRoot->GetRight(), tKey);
		}
		else
		{
			return pRoot;
		}
	}
	CBinarySearchTreeNode * GetMaximum(CBinarySearchTreeNode * pRoot)
	{
		return (pRoot->GetRight() != NULL) ? (GetMaximum(pRoot->GetRightI())) : (pRoot);
	}

	void DoInOrder(CBinarySearchTreeNode * pRoot)
	{
		if(pRoot)
		{
			DoInOrder(*(pRoot->GetLeft()));
			pRoot->Print();
			DoInOrder(*(pRoot->GetRight()));
		}
	}
	void DoPreOrder(CBinarySearchTreeNode * pRoot)
	{
		if(pRoot)
		{
			pRoot->Print();
			DoPreOrder(*(pRoot->GetLeft()));
			DoPreOrder(*(pRoot->GetRight()));
		}
	}
	void DoPostOrder(CBinarySearchTreeNode * pRoot)
	{
		if(pRoot)
		{
			DoPostOrder(*(pRoot->GetLeft()));
			DoPostOrder(*(pRoot->GetRight()));
			pRoot->Print();
		}
	}
};

#endif //  __BINARY_SEARCH_TREE_H__