一个二叉树程序

暂时只实现了插入和清空操作,后续其他操作会继续实现
#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;
}



 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值