二叉搜索树

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);

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值