二叉树实现

1.搜索二叉树的特点

1.具有很好的查询能力

2.有很好的新增和删除的性能

3.若左子树不为空,则左子树上的所有节点均小于根节点的值

4.若右子树不为空,则右子树上的所有节点均大于根节点的值

5.左右子树也可为根节点

总结:所谓二叉树就是根绝以上特性而定义的一个类似树形结构的数据类型,在我们后面实现增删查改等相关功能时,必须遵守此类规则!(二叉树中,一个值只能存在一个)

2.搜索二叉树的相关操作

此时,如果我们需要增加一个值,我们可分为4种情况:

1.新增节点的值与二叉树重复,则return SUCCESS;

2.增加节点小于根节点,并且根节点左子树为空,此时可直接添加;

3.增加节点大于根节点,并且根节点右子树为空,此时可直接添加;

4.以上情况都不满足是,通过递归函数,再次调用根节点pLeft或pRight地址作为参数递归函数,再次进行以上条件的判断;

template<class T> 										
DWORD BSortTree<T>::InsertNode(T element, TreeNode<T>* pNode)										
{	
	TreeNode<T>* pNewNode=new TreeNode<T>(element);

	if(element==pNode->element)						//等于该节点时
		return SUCCESS;

	if(pNode->pLeft==NULL && element<pNode->element)//左节点为空,小于该节点时
	{
		pNode->pLeft=pNewNode;
		pNewNode->pParent=pNode;
		size++;
		return SUCCESS;
	}

	if(pNode->pRight==NULL && element>pNode->element)//右节点为空,大于该节点时
	{
		pNode->pRight=pNewNode;
		pNewNode->pParent=pNode;
		size++;
		return SUCCESS;
	}

	if(element<pNode->element)						//小于该节点,左子树不为空时
		InsertNode(element,pNode->pLeft);
	else
		InsertNode(element,pNode->pRight);			//大于该节点,右子树不为空时

	return SUCCESS;
}									

对值与节点的值进行判断,根据二叉树右子树<根节点<右子树的特性进行函数递归

template<class T> 										
TreeNode<T>* BSortTree<T>::SearchNode(TreeNode<T>* pNode,T element)	//查找某一节点									
{										
	if(pNode==NULL)
		return NULL;
	else if(element==pNode->element)
		return pNode;
	else if(element<pNode->element)
		return SearchNode(pNode->pLeft,element);
	else if(element>pNode->element)
		return SearchNode(pNode->pRight,element);

}				

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<Windows.h>

#define SUCCESS 1 // 执行成功							
#define ERROR -1 // 执行失败			         				
										
template<class T>										
class TreeNode
{										
public:										
	T element;					//当前节点存储的数据				
	TreeNode<T>* pLeft;					//指向左子节点的指针				
	TreeNode<T>* pRight;					//指向右子节点的指针				
	TreeNode<T>* pParent;					//指向父结点的指针				
										
										
	TreeNode(T& ele)
	{									
		//初始化Node节点								
		memset(&element,0,sizeof(TreeNode));								
		//为元素赋值								
		memcpy(&element,&ele,sizeof(T));								
		pLeft = pRight = pParent = NULL;								
	}									
	//重载== 比较两结点是否相等									
	bool operator==(TreeNode<T>* node)
	{ 									
		return node->element == element?true:false;								
	}									
};										
										
template<class T>										
class BSortTree
{										
public:										
	BSortTree();						//构造函数			
	~BSortTree();						//析构函数			
public:										
	bool IsEmpty();					//判断树是否为空			
	DWORD Insert(T element);							//新增节点		
	int Delete(T element);								//删除节点	
	TreeNode<T>* Search(T element);						//查找节点			
	void InOrderTraverse(TreeNode<T>* pNode);						//中序遍历			
	void PreOrderTraverse(TreeNode<T>* pNode);						//前序遍历			
	void PostOrderTraverse(TreeNode<T>* pNode);						//后序遍历			
private:										
	TreeNode<T>* GetMaxNode(TreeNode<T>* pNode);						//获取以pNode为根的最大节点			
	TreeNode<T>* GetMinNode(TreeNode<T>* pNode);						//获取以pNode为根的最小节点			
	TreeNode<T>* SearchNode(TreeNode<T>* pNode,T element);						//获取以pNode为根的最小节点			
	DWORD InsertNode(T element, TreeNode<T>* pNode);						//新增节点			
	int DeleteNode(T element, TreeNode<T>* pNode);						//删除节点			
	void Clear(TreeNode<T>* pNode);						//清空所有节点			
private:										
	TreeNode<T>* m_pRoot;						//根结点指针			
	int size;						//树中元素总个数			
};										
										
template<class T> 										
BSortTree<T>::BSortTree()										
{										
	m_pRoot = NULL;									
	size = 0;									
}										
template<class T> 										
BSortTree<T>::~BSortTree()
{										
										
	Clear(m_pRoot);									
}
										
template<class T> 										
DWORD BSortTree<T>::Insert(T element)										
{	
	//如果根节点为空									
	if(m_pRoot==NULL)
	{
		m_pRoot=new TreeNode<T>(element);
		size++;
		return SUCCESS;
	}
	//如果根节点不为空	
	return InsertNode(element,m_pRoot);									
}										
template<class T> 										
DWORD BSortTree<T>::InsertNode(T element, TreeNode<T>* pNode)										
{	
	TreeNode<T>* pNewNode=new TreeNode<T>(element);

	if(element==pNode->element)						//等于该节点时
		return SUCCESS;

	if(pNode->pLeft==NULL && element<pNode->element)//左节点为空,小于该节点时
	{
		pNode->pLeft=pNewNode;
		pNewNode->pParent=pNode;
		size++;
		return SUCCESS;
	}

	if(pNode->pRight==NULL && element>pNode->element)//右节点为空,大于该节点时
	{
		pNode->pRight=pNewNode;
		pNewNode->pParent=pNode;
		size++;
		return SUCCESS;
	}

	if(element<pNode->element)						//小于该节点,左子树不为空时
		InsertNode(element,pNode->pLeft);
	else
		InsertNode(element,pNode->pRight);			//大于该节点,右子树不为空时

	return SUCCESS;
}										
										
template<class T> 										
void BSortTree<T>::Clear(TreeNode<T>* pNode)			//清空							
{										
	if(pNode!=NULL)									
	{									
		Clear(pNode->pLeft);								
		Clear(pNode->pRight);								
		delete pNode;								
		pNode=NULL;								
	}									
}										
										
template<class T> 										//判断是否为空
bool BSortTree<T>::IsEmpty()										
{										
	return size==0?true:false;									
}										
										
template<class T> 										
TreeNode<T>* BSortTree<T>::Search(T element)						//查找				
{										
	return SearchNode(m_pRoot,element);									
}	
									
template<class T> 										
TreeNode<T>* BSortTree<T>::SearchNode(TreeNode<T>* pNode,T element)	//查找某一节点									
{										
	if(pNode==NULL)
		return NULL;
	else if(element==pNode->element)
		return pNode;
	else if(element<pNode->element)
		return SearchNode(pNode->pLeft,element);
	else if(element>pNode->element)
		return SearchNode(pNode->pRight,element);

}										
										
template<class T> 										
int BSortTree<T>::Delete(T element)					//删除某一节点					
{										
	return DeleteNode(element,m_pRoot);
}										
										
template<class T> 										
int BSortTree<T>::DeleteNode(T element,TreeNode<T>* pNode)										
{				
	if(pNode==NULL)
		return NULL;
	TreeNode<T>* fp=Search(element);
	
	if(fp->pLeft==0 && fp->pRight==0)//如果是叶子节点
	{
		if(fp->element<fp->pParent->element)
		{
			fp->pParent->pLeft==NULL;
			delete fp;
			fp=NULL;
			size--;
			return SUCCESS;
		}
		else
		{
			fp->pParent->pRight==NULL;
			delete fp;
			fp=NULL;
			size--;
			return SUCCESS;
		}
	}

	else if(fp->pLeft==0 && fp->pRight!=0)//左子树为空,右子树不为空
	{
		if(fp->element<fp->pParent->element)//在父节点的左边
		{
			fp->pParent->pLeft=fp->pRight;
			delete fp;
			fp=NULL;
			size--;
			return SUCCESS;
		}
		else
		{
			fp->pParent->pRight=fp->pRight;
			delete fp;
			fp=NULL;
			size--;
			return SUCCESS;
		}
	}

	else if(fp->pLeft!=0 && fp->pRight==0)//左子树不为空,右子树为空
	{
		if(fp->element<fp->pParent->element)//在父节点的左边
		{
			fp->pParent->pLeft=fp->pLeft;
			delete fp;
			fp=NULL;
			size--;
			return SUCCESS;
		}
		else
		{
			fp->pParent->pRight=fp->pLeft;
			delete fp;
			fp=NULL;
			size--;
			return SUCCESS;
		}
	}

	else                                    //左右子树都不为空
	{
		if(fp!=pNode)                            //删除根节点之外的
		{
			TreeNode<int>* newNodep=FoundMax(fp->pLeft);
			if(fp->element<fp->pParent->element)    //
			{	
				if(fp->pLeft==newNodep)
				{
					fp->pParent->pLeft=newNodep;
					fp->pRight->pParent=newNodep;
					newNodep->pParent=fp->pParent;
					newNodep->pRight=fp->pRight;

					delete fp;
					fp=NULL;
					size--;
				}
				else
				{
					fp->pParent->pLeft=newNodep;
					fp->pLeft->pParent=newNodep;
					fp->pRight->pParent=newNodep;
					newNodep->pParent->pRight=NULL;
						
					newNodep->pLeft=fp->pLeft;
					newNodep->pRight=fp->pRight;
					newNodep->pParent=fp->pParent;
			
					delete fp;
					fp=NULL;
					size--;		
				}
			}
			else
			{
				if(fp->pLeft==newNodep)
				{
					fp->pParent->pRight=newNodep;
					fp->pRight->pParent=newNodep;
					newNodep->pParent=fp->pParent;
					newNodep->pRight=fp->pRight;

					delete fp;
					fp=NULL;
					size--;
				}
				else
				{
					fp->pParent->pRight=newNodep;
					fp->pLeft->pParent=newNodep;
					fp->pRight->pParent=newNodep;
					newNodep->pParent->pRight=NULL;
						
					newNodep->pLeft=fp->pLeft;
					newNodep->pRight=fp->pRight;
					newNodep->pParent=fp->pParent;
					
					delete fp;
					fp=NULL;
					size--;
				}
			}
		}
		else                                  //删除根节点
		{	
			TreeNode<int>* newNodep=FoundMax(fp->pLeft);
			
			if(newNodep==fp->pLeft)
			{
				m_pRoot=newNodep;
				fp->pRight->pParent=newNodep;
				newNodep->pRight=fp->pRight;
				newNodep->pParent=NULL;

				delete fp;
				fp=NULL;
				size--;
			}
			else
			{
				fp->pLeft->pParent=newNodep;
				fp->pRight->pParent=newNodep;

				newNodep->pLeft=fp->pLeft;
				newNodep->pRight=fp->pRight;
				newNodep->pParent->pRight=NULL;
				newNodep->pParent=NULL;            

				delete fp;
				fp=NULL;
				size--;
			}
		}
	}

										
																		
}										
TreeNode<int>* FoundMax(TreeNode<int>* fp)  //获取左子树中最大值的地址
{
	if(fp->pRight!=NULL)
	{
		return FoundMax(fp->pRight);
	}
	return fp;
}
										
										
										
//测试代码:										
										
										
void TestInsert()										
{										
	//12 8 5 9 17 15 13									
	/*									
				12						
										
		8				17				
										
	5		9		15					
										
				13						
										
	*/									
										
	BSortTree<int> tree;									
										
	tree.Insert(12);									
	tree.Insert(8);									
	tree.Insert(5);									
	tree.Insert(9);									
	tree.Insert(17);									
	tree.Insert(15);									
	tree.Insert(13);									
}										
										
void TestSerch()										
{										
	//12 8 5 9 17 15 13									
										
	BSortTree<int> tree;									
										
	tree.Insert(12);									
	tree.Insert(8);									
	tree.Insert(5);									
	tree.Insert(9);									
	tree.Insert(17);									
	tree.Insert(15);									
	tree.Insert(13);									
									
	TreeNode<int>* p = tree.Search(17);									
										
	printf("%x %d\n",p,p->element);	
	tree.Delete(12);	
	printf("%x %d\n",p,p->pParent->element);	
	
	

	
	
}										
							

int main()
{
	//TestInsert();
	TestSerch();
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值