二叉树的模板实现

二叉树的模板实现

 

#include  " iostream.h "
#include 
" stdlib.h "
#include 
" stack.h "
#pragma once

template
< class  T >
class  CBiTree{
    
public
        CBiTree(
void ) { } 
        
~ CBiTree( void ) { }

         
static   struct  _tagBiTNode {  
            T data;  
            
struct  _tagBiTNode *  lchild;  
            
struct  _tagBiTNode *  rchild; 
        };
    
private :    
        typedef _tagBiTNode BiTNode,
* BiTree;

    
public
        
bool  CreateBiTree(BiTree &  t); 
        
bool  PreOrderTraverse(BiTree t, void  ( * visit)(T data)); 
        
bool  PreOrderTraverseEx(BiTree t, void  ( * visit)(T data)); 
        
bool  InOrderTraverse(BiTree t, void  ( * visit)(T data)); 
        
bool  InOrderTraverseEx(BiTree t, void  ( * visit)(T data)); 
        
bool  PostOrderTraverse(BiTree t, void  ( * visit)(T data)); 
        
bool  PostOrderTraverseEx(BiTree t, void  ( * visit)(T data));  
        
void  CountLeaf(BiTree t, int &  count); 
        
int  BiTreeDepth(BiTree t);  // 二叉排序树的操作 
         void  CreateSortBiTree(BiTree  & root,T *  a, int  n); 
        
void  InsertNode(BiTree  & root,T e); 
        
bool  DeleteNode(BiTree  & t,T &  e); 
        
bool  SearchNode(BiTree t,T key,BiTree f,BiTree &  p);
    
private
        
void  deleteNode(BiTree &  p);
};


// 创建一个无序二叉树
template < typename T >
bool  CBiTree < T > ::CreateBiTree(BiTree &  t){  
    
int  n; 
    cin
>> n; 
    
if (n == 0
        t
= NULL; 
    
else  {  
        
if ( ! (t  =   new  BiTNode)) 
            
return   false ;  
        t
-> data  =  n;  
        CreateBiTree(t
-> lchild);  
        CreateBiTree(t
-> rchild); 
    }  
    
return   true ;
}    

// 先根遍历 递归表示
template < typename T >
bool  CBiTree < T > ::PreOrderTraverse(BiTree t, void  ( * visit)(T data)){ 
    
if (t != NULL) {  
        visit(t
-> data);  
        PreOrderTraverse(t
-> lchild,visit);  
        PreOrderTraverse(t
-> rchild,visit); 
    } 
    
return   false ;
}

// 先根遍历,栈表示
template < typename T >
bool  CBiTree < T > ::PreOrderTraverseEx(BiTree t, void  ( * visit)(T data)){ 
    
try  {  
        CStack
< BiTree > ::_tagStack s;  // 栈  
        CStack < BiTree >  stack ;
              
// if(stack == NULL)   //  return false;
      BiTree p  =   new  BiTNode;
      
if (p  ==  NULL)   
            
return   false ;
      stack.InitStack(s);  
        p 
=  t;  
        
while (p ||! stack.StackEmpty(s))  {   
            
if (p){    
                visit(p
-> data);    
                stack.Push(s,p);    
                p 
=  p -> lchild;   
            }   
            
else {    
                stack.Pop(s,p);        
                p 
=  p -> rchild;   
            }  
        }  
        stack.DestroyStack(s);  
        
return   true
    } 
catch () {  
        visit(
- 1 );  
        
return   false
    }
}

// 中序遍历,递归算法
template < typename T >
bool  CBiTree < T > ::InOrderTraverse(BiTree t, void  ( * visit)(T data)){ 
    
if (t  !=  NULL) {  
        InOrderTraverse(t
-> lchild,visit);  
        visit(t
-> data);  
        InOrderTraverse(t
-> rchild,visit); 
    } 
    
return   true ;
}

// 中序遍历,栈表示
template < typename T >
bool  CBiTree < T > ::InOrderTraverseEx(BiTree t, void  ( * visit)(T data)){ 
    
try  {  
        CStack
< BiTree > ::_tagStack s;  
        CStack
< BiTree >  stack;
      BiTree p 
=   new  BiTNode;  
      p 
=  t;  
      stack.InitStack(s);  
      
while (p ||! stack.StackEmpty(s))  {   
          
if (p){
              stack.Push(s,p);    
              p 
=  p -> lchild;   
          }   
          
else {
              stack.Pop(s,p);    
              visit(p
-> data);    
              p 
=  p -> rchild;   
          }  
      }  
      stack.DestroyStack(s);  
      
return   true
      } 
catch () {  
          visit(
- 1 );  
          
return   false
          }
}

// 后序遍历,递归算法
template < class  T >
bool  CBiTree < T > ::PostOrderTraverse(BiTree t, void  ( * visit)(T data)){ 
    
if (t  !=  NULL) {  
        PreOrderTraverse(t
-> lchild,visit);  
        PreOrderTraverse(t
-> rchild,visit);  
        visit(t
-> data); 
        } 
    
return   true ;
}

// 后序遍历,栈表示
template < class  T >
bool  CBiTree < T > ::PostOrderTraverseEx(BiTree t, void  ( * visit)(T data)){ 
    
try  {  
        CStack
< BiTree > ::_tagStack s;  
            CStack
< BiTree >  stack;  
            BiTree p 
=   new  BiTNode;  
            p 
=  t;  
            stack.InitStack(s);  
            
while (p ||! stack.StackEmpty(s))  {   
                
if (p){    
                    stack.Push(s,p
-> lchild);    
                    p 
=  p  -> lchild;   
                }   
                
else
                    visit(p
-> data);    
                    stack.Pop(s,p);    
                    p 
=  p -> rchild;    
                    visit(p
-> data);   
                }
          }  
          
return   true
      } 
catch () {  
          visit(
- 1 );  
          
return   false
          }
}

// 计数树叶的个数
template < class  T >
void  CBiTree < T > ::CountLeaf(BiTree t, int &  count){ 
    
if (t  !=  NULL) {  
        CountLeaf(t
-> lchild,count);  
        CountLeaf(t
-> rchild,count);   // 检查结点t是否为叶子结点,若是,则定量count++  
         if (t -> lchild  ==  NULL  && t -> rchild  == NULL)   
            count
++
    }
}

// 树的深度
template < class  T >
int  CBiTree < T > ::BiTreeDepth(BiTree t){ 
    
int  dep; 
    
int  depleft; 
    
int  deprigth ;
     
if ( t == NULL)  
         dep 
=   - 1
     
if ( t  !=  NULL ) {
         depleft 
=  BiTreeDepth(t -> lchild);  
         deprigth 
=  BiTreeDepth(t -> rchild);  
         dep 
=   1   +  ( depleft > deprigth ?  depleft:deprigth); 
     }   
     
return  dep;
}

//  
template < class  T >     
bool  CBiTree < T > ::SearchNode(BiTree t,T key,BiTree f,BiTree &  p){ 
    
if (t  ==  NULL){
        p 
=  f;  
        
return   false
    }
    
else   if (key  ==  t -> data)  {   
        p 
=  t;   
        
return   true ;  
    } 
    
else   if (key  <  t -> data)  {   
        SearchNode(t
-> lchild,key,t,p);  
    } 
    
else   
        SearchNode(t
-> rchild,key,t,p);
}

template
< class  T >
void  CBiTree < T > ::InsertNode(BiTree  & root,T e){ 
    BiTree t 
=  root; 
    BiTree p 
=  NULL; 
    BiTree newNode 
=   new  BiTNode;  
    
while (t) {  
        p 
=  t;  
        
if (e  <= t -> data)   
            t 
=  t -> lchild;  
        
else    
            t 
=  t -> rchild; 
    } 
    newNode
-> data  =  e; 
    newNode
-> lchild  =  newNode -> rchild  = NULL; 
    
if (p == NULL)  
        root 
=  newNode; 
    
else   
        
if (e  < p -> data)   
            p
-> lchild  =  newNode;  
        
else    
            p
-> rchild  =  newNode; 
}
// 找到要删除的结点,删除结点
template < class  T >
void  CBiTree < T > ::deleteNode(BiTree &  p){ 
    BiTree q; 
    BiTree s; 
    
if ( ! p -> lchild) {  
        q 
=  p;  
        p 
=  p -> rchild;  
        free(q); 
    } 
    
else   if ( ! p -> rchild) {  
        q 
=  p;  
        p 
=  p -> lchild;  
        free(q); 
    } 
    
else  {   
        q 
=  p;   
        s 
=  p -> lchild;   
        
while (s -> rchild){
            q 
=  s;    
            s 
=  s -> rchild;   
        }
        p
-> data  =  s -> data;   
        
if (q != p)     
            q
-> rchild  =  s -> lchild;   
        
else     
            q
-> lchild  =  s -> lchild; 
        }
}

// 查找要删除的结点,并删除
template < class  T >
bool  CBiTree < T > ::DeleteNode(BiTree  & t,T &  e){ 
    
if ( ! t)  
        
return   false
    
else  {  
        
if (e  ==  t -> data)   
            deleteNode(t);  
        
else  
            
if (e  <  t -> data)   
                DeleteNode(t
-> lchild,e);  
            
else     
                DeleteNode(t
-> rchild,e);  
            
return   true
    }
}
//  n 为数据的总长度 用n = sizeof(a) / sizeof(a[0]);

template
< class  T >
void  CBiTree < T > ::CreateSortBiTree(BiTree  & root,T *  a, int  n){ 
    
for ( int  i = 0 ;i < n;i ++ ) {  
        InsertNode(root,a[i]); 
    }
}
/* *************************************************************test************************************************************* */

void  print( int  data){ 
    
if (data  ==   - 1 )  
        cout
<< " \nError " << endl; 
        cout
<< data << " \t "
}

int  _tmain( int  argc, _TCHAR *  argv[]){
    cout
<< " \nBiTree:-----------------------\n "
    CBiTree
< int > ::_tagBiTNode  * p1 =  NULL;
    CBiTree
< int >*  tree  =   new  CBiTree < int >
     cout
<< " \n树的深度为: " << tree -> BiTreeDepth(t) << endl; 
     
int  n = 0 ;
     
int  a[] = { 8 , 6 , 9 , 10 , 23 , 2 , 3 , 0 , 4 , 0 , 5 };
     tree
-> CreateSortBiTree(p1,a, sizeof (a) / sizeof (a[ 0 ]));  
     cout
<< " \n前序遍历\n "
     tree
-> PreOrderTraverse(p1, & print); 
     cout
<< " \n "
     tree
-> PreOrderTraverseEx(p1, & print); 
     cout
<< " \n中序遍历\n " << endl; 
     tree
-> InOrderTraverse(p1, & print); 
     cout
<< " \n "
     tree
-> InOrderTraverseEx(p1, & print); 
     tree
-> CountLeaf(p1,n); 
     cout
<< " \n树的深度为: " << tree -> BiTreeDepth(p1) << endl;
    cout
<< " 叶子: " << n << endl;
     cout
<< " 查找 " << endl; 
     
int  k0 = 3
     
if (tree -> SearchNode(p1, 3 ,NULL,t)) {  
         cout
<< " 找到了 " << endl;  
         tree
-> DeleteNode(p1,k0);  
         tree
-> InOrderTraverse(p1, & print); 
     }
else   
         cout
<< " 没找到 " << endl;
}

你可能感兴趣的:(二叉树的模板实现)