二叉排序树

本文介绍了一种二叉排序树的实现方法,并提供了详细的代码示例。包括插入、删除、查找节点的操作,以及前序、中序、后序遍历等基本功能。

 二叉排序树也即二叉查找树,写的过程中指针的传参问题在一次凸显,这里我采用的是指针引用。

#include <iostream>
using namespace std;
struct BinaryTreeNode
{
	int data;
	BinaryTreeNode *lchild,*rchild;
};
class BinarySearchTree
{
private:
	BinaryTreeNode *root;
public:
	BinarySearchTree():root(NULL) {}           //构造函数
	void Insert(BinaryTreeNode *&t,int key);   //插入元素
	void PreOrder(BinaryTreeNode *t);          //前序遍历
	void InOrder(BinaryTreeNode *t);           //中序遍历
	void PostOrder(BinaryTreeNode *t);         //后序遍历
	bool Search(BinaryTreeNode *t,int key);    //搜索元素
	BinaryTreeNode *GetRoot() { return root;}  //获取根节点
	void DelNode(BinaryTreeNode *&t,int key);  //删除key元素
	void Del(BinaryTreeNode *&t);              //删除
};

void BinarySearchTree::Insert(BinaryTreeNode *&t,int key)
{
	if(!t) 
	{
		BinaryTreeNode *NewNode=new BinaryTreeNode;
		NewNode->data=key;
		NewNode->rchild=NewNode->lchild=NULL;
		t=NewNode;
		return;
	}
	BinaryTreeNode *p,*prev=0;
	p=t;
	while(p)
	{
		prev=p;
		if(key<p->data) p=p->lchild;
		else if(key==p->data) { cout<<"树中已有该节点!"<<endl; return ;}
		else if(key>p->data) p=p->rchild;
	}
	if(key<prev->data)
	{
		BinaryTreeNode *NewNode=new BinaryTreeNode;
		NewNode->data=key;
		NewNode->rchild=NewNode->lchild=NULL;
		prev->lchild=NewNode;
	}
	else if(key>prev->data)
	{
		BinaryTreeNode *NewNode=new BinaryTreeNode;
		NewNode->data=key;
		NewNode->rchild=NewNode->lchild=NULL;
		prev->rchild=NewNode;
	}
}

void BinarySearchTree::PreOrder(BinaryTreeNode *t)
{
	if(t)
	{
		cout<<t->data<<" ";
		PreOrder(t->lchild);
		PreOrder(t->rchild);
	}
}

void BinarySearchTree::InOrder(BinaryTreeNode *t)
{
	if(t)
	{
		InOrder(t->lchild);
		cout<<t->data<<" ";
		InOrder(t->rchild);
	}
}

void BinarySearchTree::PostOrder(BinaryTreeNode *t)
{
	if(t)
	{
		PostOrder(t->lchild);
		PostOrder(t->rchild);
		cout<<t->data<<" ";
	}
}
bool BinarySearchTree::Search(BinaryTreeNode *t,int key)
{
	if(!t)
	{
		cout<<"Not find!"<<endl;
		return false;
	}
	else if(key<t->data) return Search(t->lchild,key);
	else if(key>t->data) return Search(t->rchild,key);
	else if(key==t->data) { cout<<"Has been found!"<<endl; return true;}
}

void BinarySearchTree::Del(BinaryTreeNode *&t)
{
	BinaryTreeNode *del=NULL,*p=NULL;
	if(!t->rchild)         //如果右子树为空
	{
		del=t;
		t=t->lchild;
		delete del;
	}
	else if(!t->lchild)         //如果左子树为空
	{
		del=t;
		t=t->rchild;
		delete del;
	}
	else if(t->lchild&&t->rchild)        //存在左右子女
	{
		p=t;
		del=t->lchild;
		while(!del->rchild)
		{
			p=del;
			del=del->rchild;
		}
		t->data=del->data;
	 if(p!=t)
		p->rchild=del->lchild;
	 else
		 p->lchild=del->lchild;
	 delete del;
	}
}

void BinarySearchTree::DelNode(BinaryTreeNode *&t,int key)
{
	if(!t)  return ;
	if(key==t->data) Del(t);
	else if(key<t->data) DelNode(t->lchild,key);
	else if(key>t->data) DelNode(t->rchild,key);
}
int main()
{
	BinarySearchTree b;
	BinaryTreeNode *root=NULL;
	int a[10]={4,66,3,77,-4,7,88,56,93,0};
	cout<<"二叉搜索树测试"<<endl;
	for(int i=0;i<10;++i)
	b.Insert(root,a[i]);
	cout<<"前序遍历"<<endl;
	b.PreOrder(root);
	cout<<endl;
	cout<<"中序遍历"<<endl;
	b.InOrder(root);
	cout<<endl;
	cout<<"后序遍历"<<endl;
	b.PostOrder(root);
	cout<<endl;
	cout<<"搜索测试,搜索0"<<endl;
	b.Search(root,0);
	cout<<"搜索测试,搜索13"<<endl;
	b.Search(root,13);
	cout<<"删除测试,删除93"<<endl;
	b.DelNode(root,93);
	cout<<"已删除93"<<endl;
	cout<<"删除后结果"<<endl;
	b.InOrder(root);
	cout<<"插入测试"<<endl;
	cout<<"插入6后!"<<endl;
	b.Insert(root,6);
	b.InOrder(root);
	system("pause");
	return 0;
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值