C++实现一个简单的二叉搜索树

Posted Jing Sir

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++实现一个简单的二叉搜索树相关的知识,希望对你有一定的参考价值。

如下所示,这是一个简单的二叉搜索树:

template <class T>
class binarysearchtreenode
{
public:
	T data;
	binarysearchtreenode<T> *leftchild;
	binarysearchtreenode<T> * rightchild;
	binarysearchtreenode ()
	{
		leftchild=rightchild=NULL;
	}
	binarysearchtreenode(T ele)
	{
		data=ele;
		leftchild=NULL;
		rightchild=NULL;
	}
	binarysearchtreenode(T ele,binarysearchtreenode * left,binarysearchtreenode * right)
	{
		data=ele;
		leftchild=left;
		rightchild=right;
	}
	T getvalue()
	{
		return data;
	}
};
template <class T>
class binarysearchtree
{
public:
	binarysearchtreenode<T> * root;
	binarysearchtree(binarysearchtreenode<T> * r=NULL)
	{
		root=r;
	}
	bool isempty()
	{
		return root==NULL;
	}
	void visit(binarysearchtreenode<T> * t)//访问结点中元素
	{
		cout<<t->data<<' ';
	}
	void levelorder()//广度优先遍历二叉树
	{
		queue<binarysearchtreenode<T> *> nodequeue;
		binarysearchtreenode<T> * pointer=root;
		if(pointer)
			nodequeue.push(pointer);
		while(!nodequeue.empty())
		{
			pointer=nodequeue.frontT();
			visit(pointer);
			nodequeue.pop();
			if(pointer->leftchild)
				nodequeue.push(pointer->leftchild);
			if(pointer->rightchild)
				nodequeue.push(pointer->rightchild);
		}
	}
	binarysearchtreenode<T> * search(binarysearchtreenode<T> * r,T key)//二叉搜索树的查找
	{
		binarysearchtreenode<T> * current=r;
		while((r!=NULL)&&(current->getvalue()!=key))
		{
			current=(key<current->getvalue()?search(current->leftchild,key):search(current->rightchild,key));
		}
		return current;
	}
	binarysearchtreenode<T> * searchfather(binarysearchtreenode<T>* r, T key)//查找要删除树的父亲结点
	{
		binarysearchtreenode<T> * current=r;
		binarysearchtreenode<T> * father=NULL;
		if(key==r->data)
		{
			father=NULL;
			return father;
		}
		else
		{
			while(r!=NULL&&key!=current->data)
			{
				father=current;
				current=(key<current->data?current->leftchild:current->rightchild);
			}
			return father;
		}
	}
	void insertnode(const T & value)//向二叉搜索树中插入结点
	{
		binarysearchtreenode<T> * p=root,*prev=NULL;
		while(p!=0)
		{
			prev=p;
			if(p->getvalue()<value)
				p=p->rightchild;
			else
				p=p->leftchild;
		}
		if(root==NULL)
			root=new binarysearchtreenode<T>(value);
		else if(prev->getvalue()<value)
			prev->rightchild=new binarysearchtreenode<T>(value);
		else
			prev->leftchild=new binarysearchtreenode<T>(value);
	}
	void deletebymerging(binarysearchtreenode<T>* & node,binarysearchtreenode<T> * & nodefather)//合并删除
	{
		binarysearchtreenode<T> * tmp=node;
		if(node->rightchild==NULL)//被删除的结点没有右子树
		{
			if(nodefather)
			{
				if(nodefather->leftchild==node)
				{
					nodefather->leftchild=node->leftchild;

				}
				else
				{
					nodefather->rightchild=node->leftchild;
				}
			}
			else
				root=node->leftchild;
			delete node;
		}
		else if(node->leftchild==NULL)//被删除结点的左子树为空
		{
			if(nodefather)
			{
				if(nodefather->leftchild==node)
				{
					nodefather->leftchild=node->rightchild;
				}
				else
				{
					nodefather->leftchild=node->leftchild;
				}
			}
			else
				root=node->rightchild;
			delete node;
		 }
		else
		{
				tmp=node->leftchild;
				while(tmp->rightchild!=NULL)
					tmp=tmp->rightchild;
				tmp->rightchild=node->rightchild;
				if(nodefather->leftchild==node)
				{
					nodefather->leftchild=node->leftchild;
				}
				else
				{
					nodefather->rightchild=node->leftchild;
				}
				delete node;
		}
		cout<<endl;
	}
	void deletebycopying(binarysearchtreenode<T> * & node,binarysearchtreenode<T> * & nodefather)//复制删除
	{
		binarysearchtreenode<T> *previous,*tmp=node;
		if(node->rightchild==NULL)//被删除的结点没有右子树
		{
			if(nodefather)
			{
				if(nodefather->leftchild==node)
				{
					nodefather->leftchild=node->leftchild;

				}
				else
				{
					nodefather->rightchild=node->leftchild;
				}
			}
			else
				root=node->leftchild;
			delete node;
		}
		else if(node->leftchild==NULL)//被删除结点的左子树为空
		{
			if(nodefather)
			{
				if(nodefather->leftchild==node)
				{
					nodefather->leftchild=node->rightchild;
				}
				else
				{
					nodefather->leftchild=node->leftchild;
				}
			}
			else
				root=node->rightchild;
			delete node;
		 }
		else
		{
			tmp=node->leftchild;
			previous=node;
			while(tmp->rightchild!=NULL)
			{
				previous=tmp;
				tmp=tmp->rightchild;
			}
			node->data=tmp->data;
			if(previous==node)
				previous->leftchild=tmp->leftchild;
			else
				previous->rightchild=tmp->leftchild;
            delete tmp;
		}
		cout<<endl;
	}
};

 

以上是关于C++实现一个简单的二叉搜索树的主要内容,如果未能解决你的问题,请参考以下文章

C++实现的二叉搜索树BST

补充二叉搜索树C++版实现(建议看这)和应用

C ++中的二叉搜索树,叶子为空值,不适用于参考参数

二叉搜索树的详细实现(C++)

C++二叉树进阶

[ 数据结构进阶 - C++ ] 二叉搜索树 BSTree