二叉チェーンテーブルで二叉検索ツリーを実現する(二)
5637 ワード
</pre><pre code_snippet_id="367806" snippet_file_name="blog_20140528_2_6875764" name="code" class="cpp">/*
:
, ;
;
author:
Date:2014-5-28
Version:3.0
*/
#include <iostream>
#include <string>
typedef int T;//
using namespace std;
class BiTree
{
private:
struct BiNode{
T data;
BiNode *lchild,*rchild;
BiNode(T d){
data=d;
lchild=nullptr;
rchild=nullptr;
}
};
BiNode *root;
public:
BiTree(){
//root=root->rchild=root->rchild=nullptr;
root=nullptr;
}
~BiTree(){
}
//
//
// ( )
bool addBiNode(BiNode *&nodeRoot,T d){
if(nodeRoot==nullptr){
BiNode *p=new BiNode(d);
nodeRoot=p;
cout<<p->data<<" insert success!"<<endl;
return true;
}else if(nodeRoot!=nullptr&&d<nodeRoot->data){
//
addBiNode(nodeRoot->lchild,d);
}else if(nodeRoot!=nullptr&&d>(nodeRoot)->data){
//
addBiNode(nodeRoot->rchild,d);
}else{
cout<<" "<<endl;
return false;
}
}
BiNode *&getRoot(){//
return root;
}
BiNode *getPtrToRoot()const{
return root;
}
bool Traverse(const BiNode *b,string type)const{
if(type=="PreOrderTraverse"){
cout<<"
:"<<endl;
PreOrderTraverse(b);
return true;
}else if(type=="InOrderTraverse"){
cout<<"
:"<<endl;
InOrderTraverse(b);
return true;
}else if(type=="PostOrderTraverse"){
cout<<"
:"<<endl;
PostOrderTraverse(b);
return true;
}else{
cout<<" !"<<endl;
return false;
}
}
//
bool Search(BiNode *&nodeRoot,T d){
if(nodeRoot==nullptr)
return false;
else{
if(nodeRoot->data==d){
return true;
}else if(nodeRoot->data<d){
return Search(nodeRoot->rchild,d);
}else
return Search(nodeRoot->lchild,d);
}
}
//
bool DeleteBST(BiNode *&nodeRoot,T d){
if(nullptr==nodeRoot)//
return false;
else{
if(nodeRoot->data==d){//
return Delete(nodeRoot);
//Delete(nodeRoot);
}else if(nodeRoot->data<d){
return DeleteBST(nodeRoot->rchild,d);
//DeleteBST(nodeRoot->rchild,d);
}else
return DeleteBST(nodeRoot->lchild,d);
//DeleteBST(nodeRoot->lchild,d);
}
}
protected:
//
//
// , ,
//
// ,
//nodeRoot
// , ,
bool Delete(BiNode *&nodeRoot){
// ,
if(nullptr==nodeRoot->rchild){
BiNode *temp=nodeRoot;
nodeRoot=nodeRoot->lchild;
delete temp;
return true;
}else if(nullptr==nodeRoot->lchild){//
BiNode *temp=nodeRoot;
nodeRoot=nodeRoot->rchild;
delete temp;
return true;
}else{//
//
//
//
BiNode *temp=nodeRoot->lchild;//temp
BiNode *preTemp=nodeRoot->lchild;
while(nullptr!=temp->rchild){
preTemp=temp;// preTemp
temp=temp->rchild;//
//temp
}
// temp
nodeRoot->data=temp->data;// , , 。
/*
50
30 70
20
50, preTemp=temp=&30
*/
if(temp!=preTemp)
preTemp->rchild=temp->lchild;//
else
nodeRoot->lchild=temp->lchild;
delete temp;//
return true;
}
return false;
}
//T , <<
void Visit(const BiNode *r)const{
cout<<r->data<<" ";
}
// ,
// ,
void PreOrderTraverse(const BiNode *nodeRoot)const{
if(nodeRoot!=nullptr)
Visit(nodeRoot);
if(nodeRoot->lchild!=nullptr)
PreOrderTraverse(nodeRoot->lchild);
if(nodeRoot->rchild!=nullptr)
PreOrderTraverse(nodeRoot->rchild);
}
//
void InOrderTraverse(const BiNode *nodeRoot)const{
if(nodeRoot->lchild!=nullptr)
InOrderTraverse(nodeRoot->lchild);
if(nodeRoot!=nullptr)//
Visit(nodeRoot);
if(nodeRoot->rchild!=nullptr)
InOrderTraverse(nodeRoot->rchild);
}
//
void PostOrderTraverse(const BiNode *nodeRoot)const{
if(nodeRoot->lchild!=nullptr)
PostOrderTraverse(nodeRoot->lchild);
if(nodeRoot->rchild!=nullptr)
PostOrderTraverse(nodeRoot->rchild);
if(nodeRoot!=nullptr)
Visit(nodeRoot);
}
};
return 。
, 。
<pre name="code" class="cpp">#include "bit4.cpp"
int main()
{
BiTree b;
//b.addBiNode(&b.root,50);// //
b.addBiNode(b.getRoot(),50);//
int i;
int arr[9]={30,40,35,27,100,90,110,95,-999};
for(int j=0;j<9;j++)
{
i=arr[j];
if(i==-999)
break;
b.addBiNode(b.getRoot(),i);
}
b.Traverse(b.getPtrToRoot(),"PreOrderTraverse");
b.Traverse(b.getPtrToRoot(),"InOrderTraverse");
b.Traverse(b.getPtrToRoot(),"PostOrderTraverse");
while(true)
{
int k;
cout<<"
:"<<endl;
cin>>k;
if(b.Search(b.getRoot(),k))
cout<<"OK"<<endl;
else
cout<<"NO"<<endl;
}
cin.get();
system("pause");
return 0;
}