Essential c++ 第六章二叉树的完整实现

来源:互联网 发布:mac如何卸载mysql 编辑:程序博客网 时间:2024/05/17 04:34

初步深入学习C++,还很菜,自己整理的,有些不完整,但也不例外愿拿来供大家来参考,不完整的地方还望大家来补充!

 

 

#include < iostream >

#include < string >

 

using namespace std;


// class BTnode declare


template < typename elemType >
class BinaryTree;

template < typename valType >
class BTnode{
 public:
  friend class BinaryTree< valType >;
  BTnode( const valType &val );
  void insert_value( const valType &val );  
  void remove_value( const valType &val, BTnode *& prev );
  void preorder ( BTnode *pt, ostream &os ) const; 
  void display_val( BTnode *pt, ostream &os ) const;
  static void lchild_leaf( BTnode *leaf,BTnode *subtree );


 private:
  valType _val;
  int _cnt;
  BTnode *_lchild;
  BTnode *_rchild;
};
 


// class BinaryTree declare

template < typename elemType >
class BinaryTree {
 public:
  BinaryTree();
  BinaryTree( const BinaryTree& );
  ~BinaryTree();
  BinaryTree& operator=( const BinaryTree&);
  void insert( const elemType &elem );
  bool empty()
  {
   return _root==0;
  } 
        void remove( const elemType &elem );
  
        void preorder() const
  {
       _root->preorder( _root, cout );
  }
     void remove_root();

     void clear()
  {
      if( _root )
   {
         clear( _root );
      _root = 0;
   }
  } //ostream &os = _current_os

       friend ostream & operator<<( ostream &, const BinaryTree< elemType >);
   
 private:
  BTnode< elemType > *_root;
  void copy( BTnode< elemType > * &, BTnode< elemType >* );
  void clear( BTnode<elemType> * ); // static ostream   *_current_os;
};

//BTnode define

template < typename valType >
inline BTnode< valType >::
BTnode( const valType &val ) : _val( val )
{
 _cnt = 1;
 _lchild = _rchild = 0;
}

template < typename valType >
void BTnode< valType >::
preorder ( BTnode *pt, ostream &os ) const
{
 if ( pt )
 {
  display_val( pt ,os );
  if ( pt->_lchild ) preorder( pt->_lchild, os );
  if( pt->_rchild ) preorder( pt->_rchild, os );
 }
}
template < typename valType >
void BTnode< valType >::
insert_value( const valType &val )
{
 if( val == _val)
 {
  _cnt++;
  return;
 }
  if( val < _val )
 {
  if( ! _lchild )
    _lchild = new BTnode( val );
  else
    _lchild->insert_value( val );
 }
 else
 {
  if( ! _rchild )
   _rchild = new BTnode( val );
  else
   _rchild->insert_value( val );
 } 
}

template < typename valType >
void BTnode< valType >::
remove_value( const valType &val, BTnode *& prev )
{
 if( val < _val)
 {
  if( ! _lchild )
   return;

  else
   _lchild->remove_value( val ,_lchild );
 }
 else
  if( val > _val )
  {
   if( ! _rchild )
    return;
   else
    _rchild->remove_value( val,_rchild );
  }
  else
  {
   if( _rchild )
   {
    prev = _rchild;
    if( _lchild )
     if( ! prev->_lchild )
      prev->_lchild = _lchild;
     else
      BTnode< valType >::lchild_leaf( _lchild,prev->_lchild );
   }
   else prev = _lchild;
   delete this;
  }
  
}
template <typename valType>
inline void BTnode<valType>::
display_val( BTnode *pt, ostream &os ) const
{
       os << pt->_val;
       if ( pt->_cnt > 1 )
            os << "( " << pt->_cnt << " ) ";
       else os << ' ';
}
template < typename valType >
void BTnode< valType >::
lchild_leaf( BTnode *leaf, BTnode *subtree )
{
 while ( subtree->_lchild )
  subtree = subtree->_lchild;
 subtree->_lchild = leaf;
}

// BinaryTree define
template < typename elemType >
inline BinaryTree< elemType >::BinaryTree() : _root( 0 )
{}

template < typename elemType >
inline BinaryTree< elemType >::BinaryTree( const BinaryTree &rhs )
{
 copy( _root,rhs._root);
}

template < typename elemType >
inline BinaryTree< elemType >:: ~BinaryTree()
{
 clear();
}

template < typename elemType >
inline BinaryTree < elemType >&
BinaryTree< elemType >::
operator=( const BinaryTree &rhs )
{
 if ( this != &rhs )
 
 
 {
  clear();
  copy(_root,rhs._root );
 }

 return *this;
}

template < typename elemType >
inline void BinaryTree< elemType >::
insert( const elemType &elem )
{
 if( !_root )
  _root = new BTnode< elemType >( elem );
 else
  _root->insert_value( elem );
}
 
template < typename elemType >
void BinaryTree< elemType >::
remove_root()
{
 if( ! _root )
  return ;
 BTnode< elemType > *tmp = _root;
 if( _root->_rchild )
 {

     _root = _root->_rchild;

    if( tmp->_rchild )
    {
  
   BTnode< elemType > *lc = tmp->_lchild;
   BTnode< elemType > *newlc = _root->_lchild;
   if( !newlc )
      _root->_lchild = lc;
   else
   BTnode <elemType>::lchild_leaf( lc,newlc );
    }
 }
 else
  _root = _root->_lchild;
 delete tmp;
}

template < typename elemType >
void BinaryTree< elemType >::
remove( const elemType &elem )
{
   if( _root )
 {
    if( _root->_val == elem )
    remove_root();
  else
    _root->remove_value( elem, _root );
 }
}

   
template < typename elemType >
void BinaryTree< elemType >::
clear( BTnode< elemType > *pt )
{
 if( pt )
 {
  clear( pt->_lchild );
  clear( pt->_rchild );
  delete pt;
 }
}
template < typename elemType >  //BinaryTree< elemType >::
 ostream & operator<<( ostream &os, const BinaryTree< elemType > &bt )
{
  os << "Tree : "<< endl;
  bt.print( os );
 
  return os;
 }

template <typename elemType>
void BinaryTree<elemType>::
copy( BTnode<elemType> * &tar, BTnode<elemType> *src )
{
    if ( src )
 {//( )
   tar = new BTnode<elemType>( src->_val );
   if ( src->_lchild ) copy( tar->_lchild, src->_lchild );
   if ( src->_rchild ) copy( tar->_rchild, src->_rchild );
 }
}

int main()
{
 BinaryTree< string > bt;


 bt.insert( " Piglet " );
 bt.insert( "Eeyore" );
 bt.insert( "Roo" );
 bt.insert( "Tigger" );
 bt.insert( "Chris" );
 bt.insert( "Pooh" );
 bt.insert( "Kanga" );

 cout<< "Preorder traversal: /n";

 bt.preorder();

 bt.remove( "Piglet" );
 cout<< " /n/n Preorder traversal after Piglet removal: /n";
 bt.preorder();

 bt.remove( "Eeyore" );
 cout<< "/n/n Preorder traversal after Eeyore removal : /n";
 bt.preorder();

 return 0;
}

 

 

原创粉丝点击