C++ 二叉搜索树 模板的代码

2019-04-12  本文已影响0人  gougoude

将写内容过程重要的一些内容备份一次,下面内容内容是关于C++ 二叉搜索树 模板的内容,希望能对大家也有帮助。

#pragma once

#include <iostream>

#include <cstdlib>

#include <queue>

using namespace std;

template <class T> class STree;

template <class T>

class TNode{

friend class STree_iterator<T>;

friend class STree_const_iterator<T>;

protected:

T data;

void copy(const TNode<T> &rhs) {

left=rhs.left;

right=rhs.right;

parent=rhs.parent;

data=rhs.data;

}

public:

TNode() {left=NULL, right=NULL, parent=NULL;}

:data(item), left(lptr), right(rptr), parent(pptr) {}

TNode( const TNode<T> &rhs) { copy(rhs); }

~TNode() {}

};

template <class T>

class STree {

friend class STree_iterator<T>;

friend class STree_const_iterator<T>;

protected:

int size;

public:

typedef T value_type;

STree(void);

STree(const STree<T> &rhs);

~STree(void);

connect the right subtree of R to its parent as the left sub tree

connect the left subtree of the deleted node to R as the left subtree link the right

subtree of the deleted node to R as its right sub tree, and the substitute the

void erase(iterator first, iterator last);

void LevelorderPrint();

bool empty() const {return root==NULL;}

int Size() const {return size;}

template <class T>

STree<T>::STree(void){

root=NULL;

size=0;

}

template <class T>

root=NULL;

size=0;

while(first!=last) {

++first;

}

}

template <class T>

STree<T>::STree(const STree<T> &rhs) {

root=copy( rhs.Root() );

size=rhs.Size();

}

template <class T>

STree<T> &STree<T>::operator=(const STree<T> &rhs){

if(this==rhs) return this;

DelTree(root);

root=copy(rhs.Root());

size=rhs.Size();

return this;

}

template <class T>

STree<T>::~STree(void){

DelTree(root);

}

template <class T>

if(newnode==NULL) {cerr<<"allocate storage for new node failed!"<<endl; exit(0);}

return newnode;

}

template <class T>

if(rhs==NULL) return NULL;

lptr=copy(rhs->left);

newnode=GetNode(rhs->data, lptr, rptr, NULL);

if(lptr!=NULL) lptr->parent=newnode;

if(rptr!=NULL) rptr->parent=newnode;

}

template <class T>

if(_root!=NULL){

DelTree(_root->left);

DelTree(_root->right);

delete _root;

}

}

template <class T>

while(cur!=NULL) {

if(item==cur->data) return cur;

else if(item<cur->data) cur=cur->left;

else cur=cur->right;

}

return cur;

}

template <class T>

int r_depth, l_depth, depth;

if(cur==NULL) depth=-1;

else {

r_depth=height(cur->right);

l_depth=height(cur->left);

depth=1+(r_depth>l_depth?r_depth:l_depth);

}

return depth;

}

template <class T>

typename STree<T>::iterator STree<T>::find(const T& item){

cur=findNode(item);

if(cur!=NULL) return STree<T>::iterator(cur, this);

else return this->end();

}

template <class T>

typename STree<T>::iterator STree<T>::insert(const T& item) {

while(cur!=NULL) {

par=cur;

if(item==cur->data) return STree<T>::iterator(cur, this);

else if(item<cur->data) cur=cur->left;

else cur=cur->right;

}

newnode=GetNode(item, NULL, NULL, par);

if(par==NULL) root=newnode;

else if(item<par->data) par->left=newnode;

else par->right=newnode;

++size;

return STree<T>::iterator(newnode, this);

}

template <class T>

bool STree<T>::erase(const T& item) {

STree<T>::iterator pos=find(item);

if( pos!=end() ) erase(pos);

return pos!= end();

}

template <class T>

void STree<T>::erase(typename STree<T>::iterator pos) {

if(del==NULL) return;

if(del->left==NULL || del->right==NULL) {

if(del->left==NULL) subs=del->right;

else subs=del->left;

if(subs != NULL) subs->parent=par;

}

else {

subs=del->right;

while(subs->left!=NULL) {

temp=subs;

subs=subs->left;

}

if(temp==del) {

subs->left=del->left;

subs->parent=par;

subs->left->parent=subs;

}

else {

if(subs->right!=NULL) subs->right->parent=temp;

subs->left->parent=subs;

subs->right->parent=subs;

}

}

if(par==NULL) root=subs;

else if(par->left==del) par->left=subs;

else par->right=subs;

delete del;

--size;

}

template <class T>

void STree<T>::erase(typename STree<T>::iterator first, typename STree<T>::iterator last){

STree<T>::iterator iter=first;

while(iter!=last) {

erase(iter);

++iter;

}

}

template <class T>

void STree<T>::LevelorderPrint() {

queue< TNode<T> > parQ;

queue< TNode<T> > chdQ;

while(!parQ.empty()) {

do{

parQ.pop();

cout<<cur->data<<ends;

} while(!parQ.empty());

cout<<endl;

parQ=chdQ;

queue< TNode<T> > empty;

swap(chdQ, empty);

}

delete cur;

cur=NULL;

}

template <class T>

typename STree<T>::iterator STree<T>::begin(){

if(cur!=NULL)

while(cur->left!=NULL)

cur=cur->left;

}

template <class T>

return STree<T>::iterator(NULL, this);

}

template<class T, class Ref, class Ptr>

friend class STree<T>;

public:

typedef STree_iterator<T, Ref, Ptr> self;

typedef std::bidirectional_iterator_tag iterator_category;

typedef T value_type;

typedef Ref reference;

typedef Ptr pointer;

typedef ptrdiff_t difference_type;

public:

STree_iterator(){

pn=NULL;

tree=NULL;

}

pn=rhs.pn;

tree=rhs.tree;

}

bool operator==(const STree_iterator &rhs) const {return pn == rhs.pn;}

bool operator!=(const STree_iterator &rhs) const {return pn != rhs.pn;}

if(pn==NULL) {cerr<<"allocate storage for new node failed!"<<endl; exit(0);}

return pn->data;

}

pn=tree->root;

if(pn==NULL) { cerr<<"move on a empty tree!"<<endl; exit(0);}

while(pn->left!=NULL) pn=pn->left;

}

pn=pn->right;

while(pn->left!=NULL) pn=pn->left;

}

p=pn->parent;

while(p!=NULL && pn==p->right) {

pn=p;

p=p->parent;

}

pn=p;

}

}

self temp(pn, tree);

}

pn=tree->root;

if(pn==NULL) {cerr<<"move on a empty tree!"<<endl; exit(0);}

while(pn->right!=NULL) pn=pn->right;

}

pn=pn->left;

while(pn->right!=NULL) pn=pn->right;

}

p=pn->parent;

while(p!=NULL && pn==p->left) {

pn=p;

p=p->parent;

}

pn=p;

}

}

self operator--(int) {

self temp(pn, tree);

}

private:

};

template<class T, class Ref, class Ptr>

class STree_const_iterator{

friend class STree<T>;

public:

typedef STree_const_iterator<T, Ref, Ptr> self;

typedef std::bidirectional_iterator_tag iterator_category;

typedef T value_type;

typedef Ref reference;

typedef Ptr pointer;

typedef ptrdiff_t difference_type;

public:

STree_const_iterator(){

pn=NULL;

tree=NULL;

}

pn=rhs.pn;

tree=rhs.tree;

}

pn=rhs.pn;

tree=rhs.tree;

}

bool operator==(const STree_const_iterator &rhs) const {return pn == rhs.pn;}

bool operator!=(const STree_const_iterator &rhs) const {return pn != rhs.pn;}

return pn->data;

}

pn=tree->root;

if(pn==NULL) { cerr<<"STree STree_const_iterator operator++(): tree empty"<<endl; exit(0); }

while(pn->left!=NULL) pn=pn->left;

}

pn=pn->right;

while(pn->left!=NULL) pn=pn->left;

}

p=pn->parent;

while(p!=NULL && pn==p->right) {

pn=p;

p=p->parent;

}

pn=p;

}

}

STree<T>::STree_const_iterator temp(pn, tree);

}

pn=tree->root;

if(pn==NULL)

throw underflowError

("STree STree_const_iterator operator++(): tree empty");

while(pn->right!=NULL) pn=pn->right;

}

pn=pn->left;

while(pn->right!=NULL) pn=pn->right;

}

p=pn->parent;

while(p!=NULL && pn==p->left) {

pn=p;

p=p->parent;

}

pn=p;

}

}

STree_const_iterator operator--(int) {

STree_const_iterator temp(pn, tree);

}

private:

};

上一篇下一篇

猜你喜欢

热点阅读