二叉查找树的模板类实现(二)

下面贴出所有的代码:

BinaryTreeNode.h 文件

template<class key,class value>
class BinaryTreeNode
{
private:
	key theKey;
	value theValue;
	BinaryTreeNode<key,value> *parent;
	BinaryTreeNode<key,value> *left;
	BinaryTreeNode<key,value> *right;
public:
	BinaryTreeNode();
	BinaryTreeNode(key theKey,value theValue);

	key getKey();
	value getValue();
	BinaryTreeNode<key,value> *getLeft();
	BinaryTreeNode<key,value> *getRight();
	BinaryTreeNode<key,value> *getParent();

	void setKey(key theKey);
	void setValue(value theValue);	
	void setLeft(BinaryTreeNode<key,value> *left);
	void setRight(BinaryTreeNode<key,value> *Right);
	void setParent(BinaryTreeNode<key,value> *parent);
};
template<class key,class value>
BinaryTreeNode<key,value>::BinaryTreeNode()
{
	parent=NULL;
	left = NULL;
	right = NULL;
}
template<class key,class value>
BinaryTreeNode<key,value>::BinaryTreeNode(key theKey,value theValue)
{
	this->theKey = theKey;
	this->theValue = theValue;
	parent=NULL;
	left = NULL;
	right = NULL;
}
template<class key,class value>
key BinaryTreeNode<key,value>::getKey()
{
	return theKey;
}
template<class key,class value>
value BinaryTreeNode<key,value>::getValue()
{
	return theValue;
}
template<class key,class value>
BinaryTreeNode<key,value> *BinaryTreeNode<key,value>::getLeft()
{
	return left;
}
template<class key,class value>
BinaryTreeNode<key,value> *BinaryTreeNode<key,value>::getRight()
{
	return right;
}
template<class key,class value>
BinaryTreeNode<key,value> *BinaryTreeNode<key,value>::getParent()
{
	return parent;
}
template<class key,class value>
void BinaryTreeNode<key,value>::setValue(value theValue)
{
	this->theValue = theValue;
}
template<class key,class value>
void BinaryTreeNode<key,value>::setKey(key theKey)
{
	this->theKey = theKey;
}
template<class key,class value>
void BinaryTreeNode<key,value>::setLeft(BinaryTreeNode<key,value> *left)
{
	this->left = left;
}
template<class key,class value>
void BinaryTreeNode<key,value>::setRight(BinaryTreeNode<key,value> *right)
{
	this->right = right;
}
template<class key,class value>
void BinaryTreeNode<key,value>::setParent(BinaryTreeNode<key,value> *parent)
{
	this->parent=parent;
}

BSTree.h 文件

#include <string.h>
#include "BinaryTreeNode.h"
template <class key, class value>
class BSTree
{
private:
BinaryTreeNode<key,value> *root;

public:
BSTree();
public:
BinaryTreeNode<key,value> *get(key theKey); 
BinaryTreeNode<key,value> *getRoot(); 

BinaryTreeNode<key,value> *remove(key theKey);
void insert(key theKey, value theValue);
void ascend(BinaryTreeNode<key,value> *);
void outPut();
BinaryTreeNode<key,value> *tree_minimum(BinaryTreeNode<key,value> *p);
BinaryTreeNode<key,value> *tree_maximum(BinaryTreeNode<key,value> *p);
BinaryTreeNode<key,value> *tree_successor(BinaryTreeNode<key,value> *p);
};

BSTree.cpp 文件

#include "BSTree.h"
#include <iostream>
using namespace std;
template<class key,class value>
BSTree<key,value>::BSTree()
{
	root = NULL;
}
template<class key,class value>
BinaryTreeNode<key,value> *BSTree<key,value>::get(key theKey)
{
	BinaryTreeNode<key,value> *p=root;
	while(p!=NULL)
	{
		if(theKey < p->getKey())
		p=p->getLeft();
		else if(theKey > p->getKey())
		p=p->getRight();
		else
		return p;
	}
	return NULL;
}
template<class key,class value>
void BSTree<key,value>::insert(key theKey,value theValue)
{
	BinaryTreeNode<key,value> *p=root; //search pointer
	BinaryTreeNode<key,value> *parent=NULL;//parent of p;
	while(p!=NULL)
	{
		parent=p;
		if(theKey < p->getKey())
		   p=p->getLeft();
		else if(theKey > p->getKey())
		   p=p->getRight();
		else
		{
		   p->setValue(theValue);
		return;
		}
	}
	BinaryTreeNode<key,value> *newNode 
	= new BinaryTreeNode<key,value>(theKey,theValue);
	if(root == NULL)
	   root = newNode;
	else
	{
	    if(theKey < parent->getKey())
	    {
	       parent->setLeft(newNode);
	       newNode->setParent(parent);
	    }
	    else
	    {
	       parent->setRight(newNode);
	       newNode->setParent(parent);
	    }
	}
	return;
}
template<class key,class value>
BinaryTreeNode<key,value> *BSTree<key,value>::remove(key theKey)
{
	BinaryTreeNode<key,value> *deletedNode=get(theKey);
	if(deletedNode==NULL) return NULL;
	BinaryTreeNode<key,value> *todelete;
	BinaryTreeNode<key,value> *nextNode;
	if(deletedNode->getLeft()==NULL || deletedNode->getRight()==NULL)
	   todelete = deletedNode;
	else
	   todelete = tree_successor(deletedNode);
	if(todelete->getLeft()!=NULL)
	   nextNode=todelete->getLeft();
	else
	   nextNode=todelete->getRight();
	if(nextNode!=NULL)
	   nextNode->setParent(todelete->getParent());
	if(todelete->getParent()==NULL)
	   nextNode=root;
	else if(todelete->getParent()->getLeft()==todelete)
	   todelete->getParent()->setLeft(nextNode);
	else
	   todelete->getParent()->setRight(nextNode);
	if(todelete==deletedNode)
	{
	   deletedNode->setKey(todelete->getKey());
	   deletedNode->setValue(todelete->getValue());
	}
	return todelete;
}
template<class key,class value>
void BSTree<key,value>::ascend(BinaryTreeNode<key,value> *p)
{
	if(p!=NULL)
	{
	   ascend(p->getLeft());
	   cout<<p->getKey()<<"   "<<p->getValue()<<endl;
	   ascend(p->getRight());
	}
}

template<class key,class value>
void BSTree<key,value>::outPut()
{
	BinaryTreeNode<key,value> *temp=tree_minimum(root);
	ascend(temp);
}

template<class key,class value>
BinaryTreeNode<key,value> *BSTree<key,value>::tree_minimum(BinaryTreeNode<key,value> *p)
{
	if(p==NULL)
	return NULL;
	BinaryTreeNode<key,value> *pp=p;
	while(pp->getLeft()!=NULL)
	   pp=pp->getLeft();
	return pp;
}

template<class key,class value>
BinaryTreeNode<key,value> *BSTree<key,value>::tree_maximum(BinaryTreeNode<key,value> *p)
{
	if(p==NULL)
	return NULL;
	BinaryTreeNode<key,value> *pp=p;
	while(pp->getRight()!=NULL)
	   pp=pp->getRight();
	return pp;
}
template<class key,class value>
BinaryTreeNode<key,value> *BSTree<key,value>::tree_successor(BinaryTreeNode<key,value> *p)
{
	if(p==NULL) return NULL;
	   BinaryTreeNode<key,value> *pp=p;
	if(pp->getRight()!=NULL)
	   return tree_minimum(pp->getRight());
	BinaryTreeNode<key,value> *y=p->getParent();
	while(y!=NULL && pp==y->getRight())
	{
	   pp=y;
	   y=y->getParent();
	}
	return y;
}

template<class key,class value>
BinaryTreeNode<key,value> *BSTree<key,value>::getRoot()
{
	return root;
}

templateInstanceBSTree.cpp 文件

#include "BSTree.cpp"
#include <string>
using namespace std;
template class BSTree<int,string>;

main.cpp 文件

#include <iostream>
#include <string.h>
#include "BSTree.h"
using namespace std;
int main()
{
	BSTree<int,string> bstree;
	bstree.insert(0,"Jim");
	bstree.insert(7,"Green");
	bstree.insert(2,"Lucy");
	bstree.insert(1,"Brown");
	bstree.insert(3,"Lily");
	bstree.insert(8,"Tom");
	bstree.insert(4,"John");
	bstree.insert(6,"Peter");
	bstree.insert(5,"Joson");

	bstree.outPut();
	BinaryTreeNode<int,string> *p=bstree.getRoot();
	bstree.remove(3);
	while(p!=NULL)
	{
		cout<<p->getKey()<<endl;
		p=bstree.tree_successor(p);
	}
	return 0;
}
posted @ 2011-10-03 00:30  哈哈开心  阅读(295)  评论(0编辑  收藏  举报