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++实现搜索二叉树

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

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

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

C++二叉搜索树

C++二叉搜索树