HeadMain.h
#include<iostream>
using namespace std;
#include"BFTree.h"
BFTree.h
typedef int MyType ;
struct BFTreeNode
{
BFTreeNode *left;
BFTreeNode *right;
int data;
BFTreeNode()
{
left=NULL;
right=NULL;
}
};
class CBFTree
{
public:
int m_Size;
BFTreeNode * m_Broot;
CBFTree();
~CBFTree();
void InitBFTree( BFTreeNode * BR);//初始化二叉搜索树
void InsertBFTree( BFTreeNode *& BR,MyType item );//插入
void CreateBFTree( BFTreeNode *&BR,MyType a[], int n);// 创建
bool FindBFTree(BFTreeNode *& BR,MyType item );//查找
int GetTreeLen();//求取长度
bool DeleteBFTree(BFTreeNode *&BR, int &item);//删除操作
void InorderBFTree( BFTreeNode *BR);//打印,输出 中序打印
bool FindTree(BFTreeNode *BR, MyType item);
bool DeleteTwoTree(BFTreeNode *&BST,int &key);
};
BFTree.cpp
#include"HeadMain.h"
CBFTree::CBFTree()
{
m_Broot=NULL;
m_Size=0;
}
CBFTree::~CBFTree()
{
delete m_Broot;
m_Broot=NULL;
}
void CBFTree::InitBFTree( BFTreeNode * BR)
{
BR=NULL;
m_Broot=NULL;
m_Size=0;
}
void CBFTree::InsertBFTree( BFTreeNode * &BR,MyType item )
{
BFTreeNode *p = new BFTreeNode();
p->data=item;
if(BR==NULL)
{
BR=p;
m_Size++;
}
else
{
if(item>BR->data) InsertBFTree(BR->right,item);
else InsertBFTree(BR->left,item);
}
}
void CBFTree::CreateBFTree( BFTreeNode *&BR,MyType a[], int n)
{
for(int i=0;i<n;i++)
{
InsertBFTree(BR,a[i]);
}
}
bool CBFTree::FindBFTree(BFTreeNode *& BR,MyType item )
{
if(BR==NULL)
{
//cout<<"emptyasdf"<<endl;
return false;
}
else
{
if(BR->data==item)
{
return true;
}
else if(BR->data>item)
{
return FindBFTree(BR->right,item);
}
else
{
return FindBFTree(BR->left,item);
}
}
}
int CBFTree::GetTreeLen()
{
return m_Size;
}
bool CBFTree::DeleteBFTree(BFTreeNode *&BR, int&item)
{
// 树为空的时候
if(BR==NULL)return false;
//小于树根结点时
if(item<BR->data) return DeleteBFTree(BR->left,item);
//大于树根结点时
if(item>BR->data) return DeleteBFTree(BR->right,item);
BFTreeNode *temp = BR;
//删除元素等于树根结点值且左子树为空时,将右子树做为整棵树返回
if(BR->left==NULL)
{
BR=BR->right;delete temp;temp=NULL;return true;
}
//删除元素等于树根结点值且右子树为空时,将左子树作为整棵树返回
else if(BR->right==NULL)
{
BR=BR->left;delete temp;temp=NULL;return true;
}
//删除结点元素等于树根结点且左右子树都不为空的处理如下情况
else
{
// 中序前驱结点就是左孩子是,把左孩子结点赋给该结点即可
if(BR->left->right==NULL)
{
BR->data=BR->left->data;
return DeleteBFTree(BR->left,BR->left->data);
}
// 找出中序前驱结点,即左子树的右孩子。
else
{
BFTreeNode *p1=BR,*p2=BR->left;
while(p2->right!=NULL)
{
p1=p2;
p2=p2->right;
}
BR->data=p2->data;
return DeleteBFTree(p1->right,p2->data);
}
}
return true;
}
/*
首先把它的中序前驱结点的值赋给该结点,然后删除它的中序前驱结点,因为它的中序前驱结点的右指针为空,
所以只要把中序前驱结点的左指针链接的中序前驱结点所在的位置即可
*/
void CBFTree::InorderBFTree( BFTreeNode *BR)
{
if(BR!=NULL)
{
InorderBFTree(BR->left);
cout<<BR->data<<" ";
InorderBFTree(BR->right);
}
}
bool CBFTree::FindTree(BFTreeNode *BR, MyType item)
{
while(BR!=NULL)
{
if(item==BR->data)
return true;
else if(BR->data>item) BR=BR->left;
else BR=BR->right;
}
return false;
}
bool CBFTree::DeleteTwoTree(BFTreeNode *&BST,int &key)
{ //树为空的时候
if(BST==NULL)
{
return false;
}
//关键字小于结点时候
if(key<BST->data)
{
return DeleteTwoTree(BST->left,key);
}
//关键字大于结点时候
if(key>BST->data)
{
return DeleteTwoTree(BST->right,key);
}
BFTreeNode *pTemp=BST;
//左边的树为空时候
if(BST->left==NULL)
{
BST=BST->right;
delete pTemp;
pTemp=NULL;
return true;
}
//右边的树为空时候
else if(BST->right==NULL)
{
BST=BST->left;
delete pTemp;
pTemp=NULL;
return true;
}
//左右都不为空的时候删除 根据书的特性找到中序前驱结点 把中序前驱结点的值给该结点然后删除中序前驱结点即可
else
{
if(BST->left->right==NULL)
{
BST->data=BST->left->data;
return DeleteTwoTree(BST->left,BST->left->data);
}
else
{
BFTreeNode *p1=BST,*p2=BST->left;
while(p2->right!=NULL)
{
p1=p2;
p2=p2->right;
}
BST->data=p2->data;
return DeleteTwoTree(p1->right,p2->data);
}
}
}
Main.cpp
#include"HeadMain.h"
void main()
{
BFTreeNode * br=NULL;
CBFTree * ftree = new CBFTree();
ftree->InitBFTree(br);
int a[12]={45,67,35,44,21,15,9,88,98,65,78,55};
ftree->CreateBFTree(br,a,12);
ftree->InorderBFTree(br);
cout<<"结点数是:"<<ftree->GetTreeLen()<<endl;
if(ftree->FindTree(br,55))
{
cout<<"find"<<endl;
}
else
{
cout<<"No find"<<endl;
}
int key;
cin>>key;
ftree->DeleteBFTree(br,key);
ftree->InorderBFTree(br);
cin>>key;
ftree->DeleteTwoTree(br,key);
ftree->InorderBFTree(br);
}