c++实现搜索二叉树

#include<iostream>
#include<cstdlib>
#include<cassert>
using namespace std;
template<class T>
struct BinaryTreeNode
{
T _key;
BinaryTreeNode<T>* left;
BinaryTreeNode<T>* right;
BinaryTreeNode(const T& x)
:_key(x)
,left(NULL)
,right(NULL)
{}


};
template<class T>
class SearchBinaryTree
{
typedef BinaryTreeNode<T> Node;
public:
SearchBinaryTree()
:_root(NULL)
{}
SearchBinaryTree(const  SearchBinaryTree& t)
:_root(t._root)
{}
~ SearchBinaryTree()
{

                            delete _root;

}
bool Insert(T t )
{
Node* key=new Node(t);
if(_root==NULL)
_root=key;
else
{
Node* cur=_root;
       Node* prev=NULL;
       while(cur!=NULL)
       {
       if(cur->_key>key->_key)
       {
       prev=cur;
       cur=cur->left;
        }
       else if(cur->_key<key->_key)
       {
       prev=cur;
       cur=cur->right;
        }
}
 
if(prev->_key>key->_key)
{
prev->left=key;
}
else
prev->right=key;
}
 
return false;

}
void Remove(const T t)
{
if(_root==NULL)
return ;
int ret= Find(t);
Node* cur=_root;
Node* prev=NULL;
if(ret==true)
{
while(cur->_key!=t&&cur)
{
if(cur->_key<t)
{
prev=cur;
cur=cur->right;
}
else if(cur->_key>t)
{
prev=cur;
cur=cur->left;
    }
else
break;
}
if(cur->left==NULL&&cur->right==NULL)
{
delete cur;
}
else if(cur->left==NULL)
{
if(cur->right->_key<prev->right->_key)
{
prev->left=cur->right;
delete cur;
}
else
{
prev->right=cur->right;
}
}
else if(cur->right==NULL)
{
prev->left=cur->left;
delete cur;
}
else
{
Node* p=cur;
cur=cur->right;
while(cur->left)
{
prev=cur;
cur=cur->left;
}
p->_key=cur->_key;
delete cur;
          
}
}
else
cout<<"false";

}
bool Find(const T t)
{
if(_root==NULL)
return false;
Node* cur=_root;
while(cur)
{
if(cur->_key<t)
cur=cur->right;
else if(cur->_key>t)
cur=cur->left;
else
return true;
}
}
void InOrder()
{
_InOrder(_root);
cout<<endl;
}


protected:

void _InOrder(Node* root)                        //中序遍历
{
Node* cur=root;
if(cur==NULL)
return;
_InOrder(cur->left);
cout<<cur->_key<<" ";
_InOrder(cur->right);
}
private:
Node* _root;

};



测试

#include"SearchBinaryTree.h"
int main()
{
SearchBinaryTree<int> tree;
int ret=0;
tree.Insert(5);
 tree.Insert(4);
  tree.Insert(1);
   tree.Insert(7);
tree.Insert(6);
 tree.Insert(3);
  tree.Insert(0);
  ret=tree.Find(7);
  tree.Remove(4);
  tree.InOrder();
  if(ret==true)
  cout<<"find"<<endl;
  else
  cout<<"not find"<<endl;

system("pause");
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值