namespace  key{ 
template < class  k > 
struct  BSTreeNode 
{ BSTreeNode< k> *  _left; BSTreeNode< k> *  _right; k _key; BSTreeNode ( const  k&  key) : _left ( nullptr ) , _right ( nullptr ) , _key ( key) { } } ; template  < class  k > 
class  BSTree  { typedef  BSTreeNode< k>  Node; 
private : Node*  _root =  nullptr ; 
public : BSTree ( )  =  default ; BSTree ( const  BSTree< k> &  t)  { _root =  Copy ( t. _root) ; } BSTree< k> &  operator = ( BSTree< k> &  t)  { swap ( _root,  t. _root) ; return  * this ; } ~ BSTree ( )  { Destroy ( _root) ; } bool  FindR ( const  k&  key)  { return  _FindR ( _root,  key) ; } bool  InsertR ( const  k&  key)  { return  _InsertR ( _root,  key) ; } bool  EraseR ( const  k&  key)  { return  _EraseR ( _root,  key) ; } bool  Insert ( const  k&  key)  { if  ( _root ==  nullptr )  { _root =  new  BSTreeNode < k> ( key) ; return  true ; } Node*  parent =  nullptr ; Node*  cur =  _root; while  ( cur)  { if  ( cur-> _key <  key)  { parent =  cur; cur =  cur-> _right; } else  if  ( cur-> _key >  key)  { parent =  cur; cur =  cur-> _left; } else  { return  false ; } } cur =  new  BSTreeNode < k> ( key) ; if  ( cur-> _key >  parent-> _key)  { parent-> _right =  cur; } else  if  ( cur-> _key <  parent-> _key)  { parent-> _left =  cur; } return  true ; } bool  find ( const  k&  key)  { Node*  cur =  _root; while  ( cur) { if  ( cur-> _key <  key)  { cur =  cur-> _right; } else  if  ( cur-> _key >  key)  { cur =  cur-> _left; } else  { return  true ; } } return  false ; } bool  Erase ( const  k&  key)  { Node*  parent =  nullptr ; Node*  cur =  _root; while  ( cur) { if  ( cur-> _key <  key)  { parent =  cur; cur =  cur-> _right; } else  if  ( cur-> _key >  key)  { parent =  cur; cur =  cur-> _left; } else { if  ( cur-> _left ==  nullptr )  { if  ( cur ==  _root)  { _root =  cur-> _right; } else  if  ( parent-> _left ==  cur)  { parent-> _left =  cur-> _right; } else  { parent-> _right =  cur-> _right; } delete  cur; } else  if  ( cur-> _right ==  nullptr ) { if  ( cur ==  _root)  { _root =  cur-> _left; } else  if  ( parent-> _left ==  cur)  { parent-> _left =  cur-> _left; } else  { parent-> _right =  cur-> _left; } delete  cur; } else { Node*  pminright =  cur;  Node*  minright =  cur-> _right; while  ( minright-> _left)  { pminright =  minright; minright =  minright-> _left; } cur-> _key =  minright-> _key; if  ( pminright-> _left ==  minright)  { pminright-> _left =  minright-> _right; } else { pminright-> _right =  minright-> _right; } delete  minright; } return  true ; } } return  false ; } void  InOrder ( )  { _InOrder ( _root) ; cout <<  endl; } void  _InOrder ( Node*  root)  { if  ( root ==  nullptr )  { return ; } _InOrder ( root-> _left) ; cout <<  root-> _key <<  "  " ; _InOrder ( root-> _right) ; } protected : Node*  Copy ( Node*  _root)  { if  ( _root ==  nullptr ) return  nullptr ; Node*  newRoot =  new  Node ( _root-> _key) ; newRoot-> _left =  Copy ( _root-> _left) ; newRoot-> _right =  Copy ( _root-> _right) ; return  newRoot; } void  Destroy ( Node*  root)  { if  ( root ==  nullptr )  { return ; } Destroy ( root-> _left) ; Destroy ( root-> _right) ; delete  root; root =  nullptr ; } bool  _FindR ( Node*  root, const  k&  key)  { if  ( root ==  nullptr ) return  false ; if  ( root-> _key ==  key)  { return  true ; } if  ( root-> _key >  key)  { return  _FindR ( root-> _left,  key) ; } else { return  _FindR ( root-> _right,  key) ; } } bool  _InsertR ( Node* &  root,  const  k&  key)  { if  ( root ==  nullptr )  { root =  new  Node ( key) ; return  true ; } if  ( root-> _key <  key) { return  _InsertR ( root-> _right,  key) ; } else  if  ( root-> _key >  key) { return  _InsertR ( root-> _left,  key) ; } else { return  false ; } } bool  _EraseR ( Node* &  root,  const  k&  key)  { if  ( root ==  nullptr ) return  false ; if  ( root-> _key <  key) { return  _EraseR ( root-> _right,  key) ; } else  if  ( root-> _key >  key) { return  _EraseR ( root-> _left,  key) ; } else { Node*  del =  root; if  ( root-> _right ==  nullptr ) { root =  root-> _left; } else  if  ( root-> _left ==  nullptr ) { root =  root-> _right; } else { Node*  maxleft =  root-> _left; while  ( maxleft-> _right) { maxleft =  maxleft-> _right; } swap ( root-> _key,  maxleft-> _key) ; return  _EraseR ( root-> _left,  key) ; } delete  del; return  true ; } } } ; 
} ; 
namespace  key_value
{ template < class  K ,  class  V > struct  BSTreeNode { BSTreeNode< K,  V> *  _left; BSTreeNode< K,  V> *  _right; K _key; V _value; BSTreeNode ( const  K&  key,  const  V&  value) : _left ( nullptr ) ,  _right ( nullptr ) ,  _key ( key) ,  _value ( value) { } } ; template < class  K ,  class  V > class  BSTree { typedef  BSTreeNode< K,  V>  Node; public : bool  Insert ( const  K&  key,  const  V&  value) { if  ( _root ==  nullptr ) { _root =  new  Node ( key,  value) ; return  true ; } Node*  parent =  nullptr ; Node*  cur =  _root; while  ( cur) { if  ( cur-> _key <  key) { parent =  cur; cur =  cur-> _right; } else  if  ( cur-> _key >  key) { parent =  cur; cur =  cur-> _left; } else { return  false ; } } cur =  new  Node ( key,  value) ; if  ( parent-> _key <  key) { parent-> _right =  cur; } else { parent-> _left =  cur; } return  true ; } Node*  Find ( const  K&  key) { Node*  cur =  _root; while  ( cur) { if  ( cur-> _key <  key) { cur =  cur-> _right; } else  if  ( cur-> _key >  key) { cur =  cur-> _left; } else { return  cur; } } return  nullptr ; } bool  Erase ( const  K&  key) { Node*  parent =  nullptr ; Node*  cur =  _root; while  ( cur) { if  ( cur-> _key <  key) { parent =  cur; cur =  cur-> _right; } else  if  ( cur-> _key >  key) { parent =  cur; cur =  cur-> _left; } else { if  ( cur-> _left ==  nullptr ) { if  ( cur ==  _root) { _root =  cur-> _right; } else { if  ( parent-> _left ==  cur) { parent-> _left =  cur-> _right; } else { parent-> _right =  cur-> _right; } } delete  cur; }  else  if  ( cur-> _right ==  nullptr ) { if  ( cur ==  _root) { _root =  cur-> _left; } else { if  ( parent-> _left ==  cur) { parent-> _left =  cur-> _left; } else { parent-> _right =  cur-> _left; } } delete  cur; } else { Node*  pminRight =  cur; Node*  minRight =  cur-> _right; while  ( minRight-> _left) { pminRight =  minRight; minRight =  minRight-> _left; } cur-> _key =  minRight-> _key; if  ( pminRight-> _left ==  minRight) { pminRight-> _left =  minRight-> _right; } else { pminRight-> _right =  minRight-> _right; } delete  minRight; } return  true ; } } return  false ; } void  InOrder ( ) { _InOrder ( _root) ; cout <<  endl; } protected : void  _InOrder ( Node*  root) { if  ( root ==  nullptr ) return ; _InOrder ( root-> _left) ; cout <<  root-> _key <<  ":"  <<  root-> _value <<  endl; _InOrder ( root-> _right) ; } private : Node*  _root =  nullptr ; } ; 
} 
# include <iostream> # include "BSTree.h" using  namespace  std; 
void  TestBSTree ( ) 
{ int  a[ ]  =  {  8 ,  3 ,  1 ,  10 ,  6 ,  4 ,  7 ,  14 ,  13  } ; key:: BSTree< int >  t1; for  ( auto  e :  a) { t1. Insert ( e) ; } t1. InOrder ( ) ; t1. Erase ( 4 ) ; t1. InOrder ( ) ; t1. Erase ( 14 ) ; t1. InOrder ( ) ; t1. Erase ( 3 ) ; t1. InOrder ( ) ; t1. Erase ( 8 ) ; t1. InOrder ( ) ; for  ( auto  e :  a) { cout <<  "delete:"  <<  e <<  "    " ; t1. Erase ( e) ; t1. InOrder ( ) ; } t1. InOrder ( ) ; 
} void  TestBSTree2 ( ) 
{ int  a[ ]  =  {  8 ,  3 ,  1 ,  10 ,  6 ,  4 ,  7 ,  14 ,  13  } ; key:: BSTree< int >  t1; for  ( auto  e :  a) { t1. InsertR ( e) ; } t1. InOrder ( ) ; t1. EraseR ( 10 ) ; t1. EraseR ( 14 ) ; t1. EraseR ( 13 ) ; t1. InOrder ( ) ; for  ( auto  e :  a) { t1. EraseR ( e) ; t1. InOrder ( ) ; } t1. InOrder ( ) ; 
} void  TestBSTree3 ( ) 
{ int  a[ ]  =  {  8 ,  3 ,  1 ,  10 ,  6 ,  4 ,  7 ,  14 ,  13  } ; key:: BSTree< int >  t1; for  ( auto  e :  a) { t1. InsertR ( e) ; } t1. InOrder ( ) ; key:: BSTree< int >  t2 ( t1) ; t2. InOrder ( ) ; 
} void  TestBSTree4 ( ) 
{ key_value:: BSTree< string,  string>  dict; dict. Insert ( "sort" ,  "排序" ) ; dict. Insert ( "left" ,  "左边" ) ; dict. Insert ( "right" ,  "右边" ) ; dict. Insert ( "string" ,  "字符串" ) ; dict. Insert ( "insert" ,  "插入" ) ; dict. Insert ( "erase" ,  "删除" ) ; string str; while  ( cin >>  str) { auto  ret =  dict. Find ( str) ; if  ( ret) { cout <<  ":"  <<  ret-> _value <<  endl; } else { cout <<  "无此单词"  <<  endl; } } 
} void  TestBSTree5 ( ) 
{ string arr[ ]  =  {  "西瓜" ,  "西瓜" ,  "苹果" ,  "西瓜" ,  "苹果" ,  "苹果" ,  "西瓜" ,  "苹果" ,  "香蕉" ,  "苹果" ,  "香蕉" ,  "梨"  } ; key_value:: BSTree< string,  int >  countTree; for  ( auto  str :  arr) { auto  ret =  countTree. Find ( str) ; if  ( ret ==  nullptr ) { countTree. Insert ( str,  1 ) ; } else { ret-> _value++ ; } } countTree. InOrder ( ) ; 
} int  main ( ) 
{ TestBSTree ( ) ; cout <<  "1"  <<  endl; TestBSTree2 ( ) ; cout <<  "2"  <<  endl; TestBSTree3 ( ) ; cout <<  "3"  <<  endl; cout <<  "4"  <<  endl; TestBSTree5 ( ) ; cout <<  "5"  <<  endl; return  0 ; 
}