二叉排序树的相关操作(插入,查找,删除,遍历等)

首先定义节点头文件
#ifndef _NODEBITREE_H
#define _NODEBITREE_H
#include<stdio.h>
class NodeBitree{
public:
	NodeBitree(int key,NodeBitree *lchild=NULL,NodeBitree *rchild=NULL):key(key),lchild(lchild),rchild(rchild){}
	//NodeBitree(){}
	~NodeBitree(){}
	NodeBitree *&getLchild(){
		return lchild;
	}
	NodeBitree *&getRchild(){
		return rchild;
	}
	int &getdata(){
		return key;
	}
	void setdata(int key){
		this->key=key;
	}
private:
	int key;
	NodeBitree *lchild;
	NodeBitree *rchild;
};
#endif


接着定义二叉排序树类以及成员方法函数

#ifndef _SORTEDBITREE_H
#define _SORTEDBITREE_H
#include "NodeBitree.h"
class SortedBitree{
public:
	SortedBitree():root(NULL){}
	~SortedBitree(){}
	NodeBitree *&getRoot(){
		return root;
	}
	bool InsertBST(NodeBitree *&root, const int data );
	bool SearchBST(NodeBitree *&root,const int data,NodeBitree *&index);
	bool SearchBST1(NodeBitree *&root,const int data,NodeBitree *&index);//非递归方式
	bool FindParent(NodeBitree *&root,const int data,NodeBitree *&p);
	void PreOrderBST(NodeBitree *&root);
	void InOrderBST(NodeBitree *&root);
	bool DeleteBST(NodeBitree *&root,const int data,NodeBitree *&parent);
	bool Delete(NodeBitree *p,NodeBitree *&parent);// 此处的P指针最后需要释放,故不能用引用形式。
private:
	NodeBitree *root;
};
#endif


成员方法实现过程

<pre name="code" class="cpp">#include "SortedBitree.h"
#include <iostream>
bool SortedBitree::InsertBST(NodeBitree *&root, const int data ){
	//	NodeBitree *node=new NodeBitree(data,NULL,NULL);
		if(!root){
			NodeBitree *node=new NodeBitree(data,NULL,NULL);
			root=node;
			return true;
		}else{
				 if(data==root->getdata())
						return false;
				 else if(data<root->getdata()){
					return InsertBST(root->getLchild(),data);
				 } else{
					return InsertBST(root->getRchild(),data);
				 }
		}
}

bool SortedBitree::SearchBST1(NodeBitree *&root,const int data,NodeBitree *&index){
	NodeBitree *tmp=root;
	if(NULL==root){
		index=NULL;
		return false;
	}else{
		while(tmp){
			if(data==tmp->getdata()){
				index=tmp;
				return true;
			}else if(data<tmp->getdata())
				tmp=tmp->getLchild();
			else
				tmp=tmp->getRchild();
		}
		index=NULL;
		return false;
	}
}

bool SortedBitree::SearchBST(NodeBitree *&root,const int data,NodeBitree *&index){
	if(root==NULL){
		index=NULL;
		return false;
	}else{
		if(root->getdata()==data){
			index=root;
			return true;
		}else if(root->getdata()<data){
			return SearchBST(root->getRchild(),data,index);
		}else{
			return SearchBST(root->getLchild(),data,index);
		}
	}
}

void SortedBitree::PreOrderBST(NodeBitree *&root){
	if(NULL==root){
		std::cout<<"空树"<<std::endl;
		return;
	}else{
		std::cout<<root->getdata()<<"---> ";
		if(root->getLchild())
			PreOrderBST(root->getLchild());
		if(root->getRchild())
			PreOrderBST(root->getRchild());
	}
}

void SortedBitree::InOrderBST(NodeBitree *&root){
	if(NULL==root){
		std::cout<<"Empty tree"<<std::endl;
	}else{
		if(root->getLchild())
			InOrderBST(root->getLchild());
		std::cout<<root->getdata()<<"--->";
		if(root->getRchild())
			InOrderBST(root->getRchild());
	}
}
bool SortedBitree::FindParent(NodeBitree *&root,const int data,NodeBitree *&p){
	if(root->getdata()==data){
		p=NULL;
		return false;
	}
	NodeBitree *tmp=root;
	while(tmp&&tmp->getdata()!=data){
		p=tmp;
		if(tmp->getdata()<data)
			tmp=tmp->getRchild();
		else
			tmp=tmp->getLchild();
	}
	if(tmp==NULL){
		p=NULL;
		return false;
	}else
		return true;
}

bool SortedBitree::Delete(NodeBitree *p,NodeBitree *&parent){
	if(!p->getLchild()&&!p->getRchild()){
		if(parent->getLchild()==p)
			parent->getLchild()=NULL;
		else
			parent->getRchild()=NULL;
		delete p;
	}else if(p->getLchild()&&!p->getRchild()){//this pointer has only left son
		if(p->getdata()>parent->getdata()){//说明该节点位于右子树
			parent->getRchild()=p->getLchild();
			//p->getLchild()=NULL;
			
		}else{
			parent->getLchild()=p->getLchild();
			//p->getLchild()=NULL;
		}
		delete p;
	}else if(p->getRchild()&&!p->getLchild()){
		if(p->getdata()>parent->getdata()){//this pointer located in right 
			parent->getRchild()=p->getRchild();
			p->getRchild()=NULL;
		}else{
			parent->getLchild()=p->getRchild();
			p->getRchild()=NULL;
		}
		delete p;
	}else{
		NodeBitree *s,*q;
		q=p;
		s=p->getLchild();
		while(s->getRchild()){
			q=s;
			s=s->getRchild();
		}
		p->setdata(s->getdata());
		if(q!=p){
			q->getRchild()=s->getLchild();
		}else{
			q->getLchild()=s->getLchild();
		}
		delete s;
	}
	return true;
//second method
	/*
  bool Delete(NodeBitree *p){ 
  NodeBitree *q, *s;
   if (!p->getLchild() && !p->getRchild())
  {
      
  }
  else if(!p->getRchild()){	//右子树空则只需重接它的左子树
	  q=p->getLchild();
    p->setdata(p->getLchild()->getdata());
    p->getLchild()=p->getLchild()->getLchild();
    p->getRchild()=p->getLchild()->getRchild();
  }
  else if(!p->getLchild()){	//左子树空只需重接它的右子树
    q=p->getRchild();
    p->setdata(p->getRchild()->getdata());
    p->getLchild()=p->getRchild()->getLchild();
    p->getRchild()=p->getRchild()->getRchild();
 }  else{
		NodeBitree *s,*q;
		q=p;
		s=p->getLchild();
		while(s->getRchild()){
			q=s;
			s=s->getRchild();
		}
		p->setdata(s->getdata());
		if(q!=p){
			q->getRchild()=s->getLchild();
		}else{
			q->getLchild()=s->getLchild();
		}
	}
	return true;
  }*/
}

bool SortedBitree::DeleteBST(NodeBitree *&root,const int data,NodeBitree *&parent){
	NodeBitree *index=NULL;
	if(NULL==root){
		std::cout<<"Empty Tree or not found"<<std::endl;
		return false;
	}
/*	if(NULL==SearchBST(root,data,index)){
		std::cout<<"NO this element"<<std::endl;
		return false;
	}*/else{
		if(root->getdata()==data){
			return Delete(root,parent);
		}
		else if(data<root->getdata())
			return DeleteBST(root->getLchild(),data,parent);
		else
			return DeleteBST(root->getRchild(),data,parent);
	}
}


 
测试主文件
#include<iostream>
#include "SortedBitree.h"
using namespace std;
int main(){
	int a[]={8,3,10,1,6,14,4,7,13};
	SortedBitree *tree=new SortedBitree();
	for(int i=0;i<9;i++){
		tree->InsertBST(tree->getRoot(),a[i]);
	}
	//测试插入功能
	//bool flag=tree->InsertBST(tree->getRoot(),14);
	//测试查找功能
	NodeBitree *index=NULL;
	bool seachFlag=tree->SearchBST1(tree->getRoot(),12,index);
	//---------------测试先序遍历
	//tree->InOrderBST(tree->getRoot());
	//bool flag1=tree->DeleteBST(tree->getRoot(), 4);
	//tree->InOrderBST(tree->getRoot());
	/* ----------测试删除排序树节点------------------*/
	NodeBitree *parent=NULL;
	tree->FindParent(tree->getRoot(),14,parent);
	tree->DeleteBST(tree->getRoot(),14,parent);
	tree->InOrderBST(tree->getRoot());


	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值