数据结构与算法_二叉查找树

BinarySearchTree.h

#pragma once
#include <iostream>
using namespace std;
template<class T> class BST;	//前置声明 
enum boolean
{
	FALSE,
	TRUE,
};


template<class T>
class Element
{
public:
	T key;	//这样做更容易添加更多新的数据,方便扩展 
};
template<class T>
class BstNode		//树的节点 
{
	friend class BST<T>;
public:
	Element<T>& getData()
	{
		return this->data;
	} 
private:
//public:
	Element<T> data;
	BstNode* leftChild;
	BstNode* rightChild;
	void Display(int i);
};

template<class T>
class BST
{
public:
	  BST(BstNode<T> *init = 0)
	  {
	  	 root = init; 
	  }	
	  boolean Insert(const Element<T> &data);
	  BstNode<T>* Search(const Element<T> &data);
	  BstNode<T>* Search(BstNode<T>*, const Element<T>&);	//递归查找 
	  BstNode<T>* IterSearch(const Element<T>&);	//迭代查找 
	  boolean DeleteNode(const Element<T> &data);
	  void InOrder();		//中序遍历
	  void InOrder(BstNode<T> *CurNode);
	  
	  void Visit(BstNode<T> *CurNode);	//显示当前节点的数据 
	  void display()
	  {
	  	if(root)
	  		root->Display(1);
	  	else
	  		cout << "这是空树" << endl;
	  }
private: 
	BstNode<T> *root;
} ;
/***************BstNode成员函数实现****************/ 
template<class T>
void BstNode<T>::Display(int i)
{
	cout << "Position: " << i << ", data.key = " << data.key << endl;
	if(leftChild)	//显示左子树 
		leftChild->Display(2*i);
	if(rightChild)	//显示右子树 
		rightChild->Display(2*i+1);
} 
/***************BST成员函数实现****************/ 
template<class T>
boolean BST<T>::Insert(const Element<T> &data)
{
	BstNode<T> *p = root;	//开始时p是指向root的,之后p是不停移动的 
	BstNode<T> *q = 0;		//q是指向p的父节点
	
	while(p)
	{
		q = p;	//q指向p的父节点
		if(data.key == p->data.key) 	return FALSE;	//发生了重复,返回失败
		if(data.key < p->data.key) 		
			p = p->leftChild;
		else if(data.key > p->data.key) 		
			p = p->rightChild;
	} 
	//循环结束时,就找到了一个空缺的位置q
	//重新利用指针p new 一个节点
	p = new BstNode<T>;
	p->data = data;
	p->leftChild = p->rightChild = 0;
	if(!root)	root = p;	//如果是空树 
	else if(data.key < q->data.key) 	q->leftChild = p;
	else q->rightChild = p;
	return TRUE; 	
}
template<class T>
BstNode<T>* BST<T>::Search(const Element<T> &node)
{
	return Search(root, node);
}

template<class T>
//从data节点开始找node 
BstNode<T>* BST<T>::Search(BstNode<T>* data, const Element<T>& node)	//递归查找 
{
	if(!data)	return 0;
	if(data->data.key == node.key) return data;
	if(node.key < data->data.key)
		return Search(data->leftChild, node);
	else
		return Search(data->rightChild, node);
}

template<class T>
BstNode<T>* BST<T>::IterSearch(const Element<T>& node)	//迭代查找 
{
	BstNode<T>* tmp = root;
	while(tmp)
	{
		if(node.key == tmp->data.key)
			return tmp;
		if(node.key < tmp->data.key)
			tmp = tmp->leftChild;
		else
			tmp = tmp->rightChild;
	}
	return 0;
}
template<class T>
boolean BST<T>::DeleteNode(const Element<T> &data)
{
	BstNode<T> *node = root;	//待删除的节点
	BstNode<T> *PreNode = NULL;	//待删除结点的父节点
	while(node)
	{
		if(node->data.key == data.key)	//找到节点 
		{
			//(1) 要删除的节点是叶子节点
			if(node->leftChild == NULL && node->rightChild == NULL)
			{
				//如果是根节点
				if(PreNode == NULL)
					root = NULL;
				else		//判断要删除的节点node是左叶子节点 还是右叶子节点 
					(node == PreNode->leftChild) ? PreNode->leftChild = NULL:PreNode->rightChild=NULL; 
				//开始删除
				delete node;
				node = NULL; 
				return TRUE;
			} 
			//(2) 要删除的节点node只有左/右子树 
			if(node->leftChild == NULL || node->rightChild == NULL)
			{
				//如果是根节点
				if(PreNode == NULL)
					(node->leftChild == NULL) ? root = node->rightChild : node->leftChild;
				else
				{
					if(PreNode->leftChild == node)
						(node->leftChild == NULL) ? PreNode->leftChild = node->rightChild : PreNode->leftChild = node->leftChild;
					else
						(node->leftChild == NULL) ? PreNode->rightChild = node->rightChild : PreNode->rightChild = node->leftChild; 
				} 
				//删除节点
				delete node;
				node = NULL; 
				return TRUE;
			}
			//(3)要删除的节点即有左子树又有右子树
			 else
			 {
			 	 //寻找左子树的最右节点作为替换节点
			 	 BstNode<T> *ReplaceNode = node->leftChild;
				 while(ReplaceNode->rightChild)
				 {
				 	ReplaceNode = ReplaceNode->rightChild;
				 } 
				 //保存替换节点的值
				Element<T> TempData = ReplaceNode->data; 
				//删除ReplaceNode节点
			 	DeleteNode(TempData);
			 	ReplaceNode = NULL;
			 	//替换值域
				 node->data = TempData; 
				 return TRUE;
			 } 
			
		}
		else
		{
			PreNode = node;
			if(data.key < node->data.key)
			{
				node = node->leftChild; 
			}
			else
			{
				node = node->rightChild;
			}
		} 
	} 
	return FALSE;
}
template<class T>
void BST<T>::InOrder()	//中序遍历
{
	InOrder(root);
}
template<class T>
void BST<T>::InOrder(BstNode<T> *CurNode)
{
	if(CurNode)
	{
		InOrder(CurNode->leftChild);
		Visit(CurNode);
		InOrder(CurNode->rightChild);
	}
}
template<class T>
void BST<T>::Visit(BstNode<T> *CurNode)	//显示当前节点的数据 
{
	cout << CurNode->data.key << " ";
}

main.h

#include <iostream>
#include "BinarySearchTree.h"
using namespace std;


int main() 
{
	BST<int> tree;
	Element<int> a,b,c,d,e,f,g,h,i,j,k,l;
	a.key = 5;
	b.key = 3;
	c.key = 11;
	d.key = 3;
	e.key = 15;
	f.key = 2;
	g.key = 8;
	h.key = 22;
	i.key = 20;
	j.key = 9;
	cout << tree.Insert(a) << endl;		//a=5 就是root 
	cout << tree.Insert(b) << endl;		//3
	cout << tree.Insert(c) << endl;		//11
	cout << tree.Insert(d) << endl;		//插入失败 
	cout << tree.Insert(e) << endl;		//15 
	cout << tree.Insert(f) << endl;		//2
	cout << tree.Insert(g) << endl;		//8
	cout << tree.Insert(h) << endl;		//22
	
	tree.display();	
	
	BstNode<int> * ret = tree.Search(f);
	cout << "找到的数是:" << ret->data.key << endl;
	
	ret = tree.IterSearch(h);
	cout << "找到的数是:" << ret->data.key << endl;
	//cout << "hello" << endl; 
	tree.InOrder();
	cout << endl;
	cout << tree.DeleteNode(g) << endl;;
	
	tree.display();	
	return 0;
}

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值