二叉搜索树的建立 插入 删除

#include <iostream>
#include <windows.h>
#include"Queue.h"
//#include"Stack.h"
using namespace std;
template<class T>
class BinarySearchTree;
template<class T>
class BinarySearchTreeNode
{
   friend class BinarySearchTree<T>;
  private:
      T element; //数据成员
      BinarySearchTreeNode<T> *leftChild;
      BinarySearchTreeNode<T> *rightChild;
  public:
    BinarySearchTreeNode();
    BinarySearchTreeNode(const T &ele);
    BinarySearchTreeNode(const T &ele,BinarySearchTreeNode<T>*l,BinarySearchTreeNode<T>*r);
    BinarySearchTreeNode<T>* getLeftChild()const;
    BinarySearchTreeNode<T>* getRightChild()const;
    void setLeftChild(BinarySearchTreeNode<T>*l);
    void setRightChild(BinarySearchTreeNode<T>*r);
    void visit();
    T getValue() const;
    void setValue(const T & val);
    bool isLeaf()const;
};
template<class T>
BinarySearchTreeNode<T>::BinarySearchTreeNode()
{
  element=0;
  leftChild=rightChild=0;
}
template<class T>
BinarySearchTreeNode<T>::BinarySearchTreeNode(const T &ele)
{
   element=ele;
   leftChild=rightChild=0;
}
template<class T>
BinarySearchTreeNode<T>::BinarySearchTreeNode(const T &ele,BinarySearchTreeNode<T>*l,BinarySearchTreeNode<T>*r)
{
   element=ele;
   leftChild=l;
   rightChild=r;
};
template<class T>
BinarySearchTreeNode<T>*BinarySearchTreeNode<T>::getLeftChild()const
{
    return this->leftChild;
}
template<class T>
BinarySearchTreeNode<T>* BinarySearchTreeNode<T>::getRightChild()const
{
    return this->rightChild;
}

template<class T>
void BinarySearchTreeNode<T>::setLeftChild(BinarySearchTreeNode<T>*l)
{
    this->leftChild=l;
}
template<class T>
void BinarySearchTreeNode<T>::setRightChild(BinarySearchTreeNode<T>*r)
{
    this->rightChild=r;
}
template<class T>
T BinarySearchTreeNode<T>::getValue() const
{
    return this->element;
}
template<class T>
void BinarySearchTreeNode<T>::setValue(const T & val)
{
    this->element=val;
}
template<class T>
bool BinarySearchTreeNode<T>::isLeaf()const
{
    if(this->leftChild==0 && this->rightChild==0)
    {
        return true;
    }
    else
    {
        return false;
    }
}
template<class T>
void BinarySearchTreeNode<T>::visit()
{
    cout<<this->element<<" ";
}

template<class T>
class BinarySearchTree
{
   private:
       BinarySearchTreeNode<T> *root;
   public:
     BinarySearchTree();
     ~BinarySearchTree();
     BinarySearchTreeNode<T> *getRoot()const;
     bool isEmpty()const;
     bool isLeaf(BinarySearchTreeNode<T> *rt);
     void breadthFirstOrder();//广度优先遍历以root为根节点的子树
     bool Find(T value);//搜索树的查找
     bool Insert(T value);//搜索树的插入
     bool Delete(T value);//搜索树的删除
     bool comDelete(T value);//搜索树的删除
};
template<class T>
BinarySearchTree<T>::BinarySearchTree()
{
    root=0;
}
template<class T>
BinarySearchTree<T>::~BinarySearchTree()
{
    ;
}
template<class T>
bool BinarySearchTree<T>::isEmpty()const
{
    if(root==0)
    {
        return true;
    }
    else
    {
        return false;
    }
}
template<class T>
BinarySearchTreeNode<T> *BinarySearchTree<T>::getRoot()const
{
    return root;
}
template<class T>
bool BinarySearchTree<T>::Find(T value)//搜索树的查找
{
       BinarySearchTreeNode<T> *p=root;
       while(p)
       {
           if(p->element==value)
           {
               return true;
           }
           else if(p->element>value)
           {
             p=p->leftChild;
           }
           else
           {
               p=p->rightChild;
           }
       }
}
template<class T>
bool BinarySearchTree<T>::Insert(T value)//搜索树的插入
{
    BinarySearchTreeNode<T> *p=root;
    BinarySearchTreeNode<T> *pre=0;
    if(root==0)
    {
        p=new BinarySearchTreeNode<T>;
        p->element=value;
        root=p;
        return true;
    }
    else
    {
       while(p)
       {
           if(p->element==value)
           {
               cout<<value<<" "<<"节点已经在树中"<<endl;
               return false;
           }
           else if(p->element>value)
           {
             pre=p;
             p=p->leftChild;
           }
           else
           {
               pre=p;
               p=p->rightChild;
           }
       }
       if(value>pre->element)
       {
           p=new BinarySearchTreeNode<T>;
           p->element=value;
           pre->rightChild=p;
       }
       else
       {
           p=new BinarySearchTreeNode<T>;
           p->element=value;
           pre->leftChild=p;
       }
    return true;
  }
}
template<class T>
bool BinarySearchTree<T>::Delete(T value)//搜索树的删除
{
    BinarySearchTreeNode<T> *p=root;
    BinarySearchTreeNode<T> *pre=0;
    while(p)
    {
        if(p->element==value)
        {
           break;
        }
        else if(p->element>value)
        {
            pre=p;
            p=p->leftChild;
        }
        else
        {
            pre=p;
            p=p->rightChild;
        }
    }
    if(p==NULL)
    {
        cout<<"该节点不在树中,删除失败"<<endl;
        return false;
    }
    if(isLeaf(p))
    {
       if(p==root)
       {
           root->leftChild=0;
           root->rightChild=0;
           delete root;
           root=0;
       }
       else
       {
         if(p->element>pre->element)
           pre->rightChild=0;
         else
           pre->leftChild=0;
            delete p;
       }
     }
     else if(p->leftChild && !p->rightChild)
     {
         if(p==root)
         {
             root=p->leftChild;
         }
        else if(p->element<pre->element)
          pre->leftChild=p->leftChild;
        else
          pre->rightChild=p->leftChild;
        delete p;
     }
     else if(p->rightChild && !p->leftChild)
     {
          if(p==root)
         {
             root=p->rightChild;
         }
        else if(p->element<pre->element)
          pre->leftChild=p->rightChild;
        else
          pre->rightChild=p->rightChild;
        delete p;
     }
     else
     {
         pre=p;
         BinarySearchTreeNode<T> *pp;
         p=p->leftChild;
         while(p->rightChild)
         {
             pp=p;
             p=p->rightChild;
         }
         pre->element=p->element;
          if(isLeaf(p))
          {
           if(p->element>pp->element)
            pp->rightChild=0;
          else
            pp->leftChild=0;
            delete p;
          }
         else if(p->leftChild)
         {
           if(p->element<pp->element)
            pp->leftChild=p->leftChild;
           else
           pp->rightChild=p->leftChild;
          delete p;
        }
     }
}
template<class T>
bool BinarySearchTree<T>::comDelete(T value)
{
    BinarySearchTreeNode<T> *p=root;
    BinarySearchTreeNode<T> *pre=0;
    while(p)
    {
        if(p->element==value)
        {
           break;
        }
        else if(p->element>value)
        {
            pre=p;
            p=p->leftChild;
        }
        else
        {
            pre=p;
            p=p->rightChild;
        }
    }
    if(p->leftChild && p->rightChild)
    {
        BinarySearchTreeNode<T> *pp;
            pp=p->leftChild;
          while(pp->rightChild)
            pp=pp->rightChild;
          pp->rightChild=p->rightChild;
          p->rightChild=0;
         if(p!=root)
         {
             if(p->element < pre->element)
            {
            cout<<"111"<<endl;
            pre->leftChild=p->leftChild;
           }
        else
          {
            cout<<"111"<<endl;
            pre->rightChild=p->leftChild;
          }
        }
        else
        {
            root=p->leftChild;
        }
          delete p;
    }
    else
    {
        Delete(p->element);
    }
}
template<class T>
bool BinarySearchTree<T>::isLeaf(BinarySearchTreeNode<T> *rt)
{
    if(!rt->leftChild && !rt->rightChild)
        return true;
    else
        return false;
}
template<class T>
void BinarySearchTree<T>::breadthFirstOrder()//广度优先遍历以root为根节点的子树
{
    Queue<BinarySearchTreeNode<T>* > que;
    BinarySearchTreeNode<T> *p=root;
    if(p)
    que.EnQueue(p);
    while(!que.IsEmpty())
    {
        que.DeQueue(p);
        p->visit();
        if(p->leftChild)
            que.EnQueue(p->leftChild);
        if(p->rightChild)
            que.EnQueue(p->rightChild);
    }
    cout<<endl;
}
int main()
{
    BinarySearchTree<int> a;
    a.breadthFirstOrder();
    for(int i=0;i<10;i++)
    {
        a.Insert(i);
    }
    for(int i=-10;i<0;i++)
    {
        a.Insert(i);
    }
    a.breadthFirstOrder();
    for(int i=0;i<10;i++)
    a.Delete(i);
    //a.comDelete(0);
    a.breadthFirstOrder();
    for(int i=-10;i<-1;i++)
    a.Delete(i);
    a.breadthFirstOrder();
    a.Delete(2);
    a.breadthFirstOrder();
    system("pause");
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值