暂时只实现了插入和清空操作,后续其他操作会继续实现
#include<iostream>
using namespace std;
#include<iomanip>
template <class T>
class bTree
{
public:
struct node{
T data;
node* left;
node* right;
node(const T data = T()):data(data),left(NULL),right(NULL){}
};
typedef node* Node;
bTree():tree(NULL),size(0){}
~bTree();
void update(const T& oldData,const T& newData)
{
if(remove(oldData))
{
insert(newData);
}
}
void insert(const T&);
void insert(node* &temp,const T&);
void insert(node* &temp,node* &temp1)
{
if(temp==NULL)
{
temp = new node();
temp = temp1;
++size;
}else{
if(temp1->data > (temp->data))
{
insert(temp->right,temp1);
}else{
insert(temp->left,temp1);
}
}
}
//template <class T>
bool remove(const T& data)
{
Node &nodp = find(data);
if(nodp==NULL)
{
return false;
}
node* temp = nodp;
//cout<<temp->data<<endl;
temp = nodp;
if(nodp->left!=NULL)
{
//cout<<"Insert"<<endl;
insert(nodp->right,nodp->left);
}
//cout<<"Insert complete!!"<<endl;
nodp = nodp->right;
delete temp;
//cout<<temp->data<<endl;
--size;
return true;
}
void show();
void show(node* &temp);
void clear();
void clear(node* &temp);
int getSize()const { return size;}
T getData(const T&);
T getData(node* &temp,const T&);
//template <class T>
Node& find(node* &temp,const T& data)
{
if(temp!=NULL)
{
if(temp->data > data)
{
return find(temp->left,data);
}
if(temp->data < data){
return find(temp->right,data);
}
return temp;
}
}
//template <class T>
Node& find(const T& data)
{
return find(tree,data);
}
void print(node* &temp, int space, char sign){
if(temp==NULL) return;
print(temp->right,space+3,'/');
cout << setw(space+1) << sign << temp->data << endl;
print(temp->left,space+3,'\\');
}
void print(){ print(tree,0,'*');cout<<"---------"<<endl; }
private:
node* tree;
int size;
};
template <class T>
bTree<T>::~bTree()
{
clear();
}
template <class T>
void bTree<T>::insert(const T& data)
{
insert(tree,data);
}
template <class T>
void bTree<T>::insert(node* &temp,const T& data)
{
if(temp==NULL)
{
temp = new node();
temp->data = data;
++size;
}else{
if(data > (temp->data))
{
insert(temp->right,data);
}else{
insert(temp->left,data);
}
}
}
template <class T>
void bTree<T>::show()
{
//cout<<"show"<<endl;
show(tree);
}
template <class T>
void bTree<T>::show(node* &temp)
{
if(temp==NULL)
{
//cout<<"show null"<<endl;
return;
}else{
show(temp->left);
cout<<temp->data<<endl;
show(temp->right);
}
}
template <class T>
void bTree<T>::clear()
{
clear(tree);
}
template <class T>
void bTree<T>::clear(node* &temp)
{
if(temp!=NULL)
{
clear(temp->left);
delete temp;
clear(temp->right);
--size;
}
}
template <class T>
T bTree<T>::getData(const T& data)
{
return find(data)->data;
}
template <class T>
T bTree<T>::getData(node* &temp,const T& data)
{
return find(temp,data)->data;
}
int main(int argc,char** argv)
{
bTree<int> test;
test.insert(30);
test.insert(10);
test.insert(15);
test.insert(5);
test.insert(40);
test.insert(45);
test.insert(1);
test.insert(3);
test.insert(6);
test.insert(7);
test.print();
cout<<"get data="<<test.getData(40)<<endl;
test.remove(10);
test.print();
test.update(40,55);
test.print();
return 0;
}