首先定义节点头文件
#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;
}