头歌|二叉排序树BST

  • Post author:
  • Post category:其他



目录


第一关:从文件中读入数据创建二叉排序树


第2关:在二叉排序树中查找元素e及其存在情况exist,并返回所查找的次数.


第3关:在二叉排序树中删除元素e,若存在就删除它并返回true,否则返回false



第一关:从文件中读入数据创建二叉排序树

任务描述

本关任务:从文件中读入数据创建二叉排序树。

测试说明

当文件 bstDataChar.txt 内容如下时:



  1. TvNVB1erdPFyiaKMQ80bJx2pUZflO3Ln

预期输出:



  1. Char type

  2. Create binary sort tree success!

  3. Inorder traversal:

  4. 0,1,2,3,8,B,F,J,K,L,M,N,O,P,Q,T,U,V,Z,a,b,d,e,f,i,l,n,n,p,r,v,x,y,

  5. Preorder traversal:

  6. T,N,B,1,0,8,2,3,F,K,J,M,L,P,O,Q,v,V,U,e,d,a,Z,b,r,i,f,p,l,n,n,y,x,

当文件 bstDataChar.txt 内容如下时:



  1. 33 49 39 51 61 30 1 11 52 3 14 63 27 17

  2. 89 19 46 21 58 29 76

预期输出:



  1. Int type

  2. Create binary sort tree success!

  3. Inorder traversal:

  4. 1,3,11,14,17,19,21,27,29,30,33,39,46,49,51,52,58,61,63,76,89,

  5. Preorder traversal:

  6. 33,30,1,11,3,14,27,17,19,21,29,49,39,46,51,61,52,58,63,89,76,

    #include "BinSortTree.h"
    
    /***********************************
     *	Copyright(c) 2016-2099 CTGU YOUNGMIEN
     *  All rights reserved.
    
     *	Version: v1.0
     *	Author: YOUNGMIEN
     *	Date: 16/04/20
     *	Company: CTGU
     *
     *	fileName: BinSortTree.cpp 
     *	Descripton: 任务文件 
     *
     *******************************/
    
    
    /* Round 1
    由文件生成二叉排序树
    如文件数据如下:
    18 14 7 3 11 22 35 27
    生成BST中序遍历得到序列如下:
    3,7,11,14,18,22,27,35, 
    
    @param fileName:string, file name 
    */
    template <typename T>
    void BinSortTree<T>::createBSTFromFile(ifstream &ifs){
        /*************** Begin ****************/
            //ifstream ifs(fileName.c_str());
            T e;
            if(ifs.good()){
                ifs >> e;
            }
            mp_root = new BinTNode<T>(e);
            
            while(ifs.good()){
                ifs >> e;
                insert(mp_root, e);
            }    
        /*************** End ****************/
        } // --- createBSTFromFile() END 
    /*Round 1
    === 在根为cur的二叉树中插入元素e 
    */
    template<typename T>
    void BinSortTree<T>:: insert(BinTNode<T> * cur, T e){
        /*************** Begin ****************/
            //生成新结点 
            BinTNode<T> * newNode = new BinTNode<T>(e);
            //循环查找,直到找到newNode要插入的位置
            while(1) { //大则向左、小则向右
                if(moreThan(newNode, cur)){ //newNode > cur
                    if(cur->m_right != NULL){
                        cur = cur->m_right;
                    }
                    else{ //cur 没有 右孩子
                        //找到
                        cur->m_right = newNode;
                        break; 
                    }            
                } //newNode > cur END
                else{ //newNode <= cur
                    if(cur->m_left != NULL){
                        cur = cur->m_left;
                    }
                    else{ //cur 没有 左孩子
                        //找到
                        cur->m_left = newNode;
                        break; 
                    }            
                } 
            } 
        /*************** End ****************/    
    }//insert() END
    	
    /* Round 2 
    ===searchTimes:在根为start中查找元素e,返回查找的次数 
    
    @param start: 子树的根结点
    @param e: 元素 
    @param exist:查找结果, true,存在;false,不存在 
    @return 查找所花费的次数 
    */
    template<typename T>
    int BinSortTree<T>::searchTimes(BinTNode<T> * start, T e, bool &exist){
            /*************** Begin ****************/
            
            if(NULL == start ){
                exist = false; 
                return 1;
            }
            else if(!cmpType(start->m_data,e) ){
                exist = true;
                return 1;
            }
            else if(cmpType(start->m_data, e) < 0){ 
                return 1+searchTimes(start->m_right, e, exist);
            } 
            else{ 
                return 1+searchTimes(start->m_left, e, exist);
            }
            /*************** End ****************/
        } 
    /* Round 3
     === 删除,在根为start中删除元素e,成功返回true否则为false
     @param start: BinTNode<T> * &,引用类型
     @param e:T,element
     @return :true,树中存在该元素;false,不存在 
    */
        template<typename T>
        bool BinSortTree<T>::removeFromBST(BinTNode<T> * & start, T e){
            /*************** Begin ****************/
                if(NULL == start){
                    return false;
                }
                else{
                    //查找 
                    
                    if( !cmpType(start->m_data,e) ){
                        delBSTNode(start);
                        return true;
                    }
                    else if(cmpType(start->m_data,e) > 0){
                        return    removeFromBST(start->m_left, e);
                    }
                    else{ 
                        return removeFromBST(start->m_right, e);
                    }
                } 
            /*************** End ****************/
            }
        /*===在二叉排序树中删除cur删除结点 
        @param cur, BinTNode<T> * &,引用类型,写操作 
        */
        template<typename T>
        void BinSortTree<T>:: delBSTNode(BinTNode<T> *  & cur){
            /*************** Begin ****************/
                BinTNode<T> * tmp = cur;
                if(NULL == cur->m_left){
                    cur = cur->m_right; 
                    delete tmp; 
                } 
                else if(NULL == cur->m_right){
                    cur = cur->m_left;
                    delete tmp; 
                }
                else{ 
                    BinTNode<T> * start = cur;
                    tmp = cur->m_left;
                    while(tmp->m_right != NULL){ 
                        start = tmp;
                        tmp = tmp->m_right;
                    }
                    
                    cur->m_data = tmp->m_data;
                    
                     if(start != cur){ 
                         start->m_right = tmp->m_left;
                    }
                    else{ 
                        cur->m_left = tmp->m_left;
                    } 
                    delete tmp;
                }
                /*************** End ****************/    
            }
    
    


    第2关:在二叉排序树中查找元素e及其存在情况exist,并返回所查找的次数.

任务描述

本关任务:在二叉排序树中查找元素 e 及其存在情况 exist,并返回所查找的次数。

测试说明

平台会对你的代码进行测试。 文件 bstDataString.txt 内容如下:



  1. bed bee add bad ebb cab dad be a art db

测试输入:



  1. bed

预期输出:



  1. String type

  2. Create binary sort tree success!

  3. Inorder traversal:

  4. a,add,art,bad,be,bed,bee,cab,dad,db,db,ebb,

  5. Preorder traversal:

  6. bed,add,a,bad,art,be,bee,ebb,cab,dad,db,db,

  7. Search an element at the tree,input key:

  8. bed

  9. Exist!The number of times to find this element is: 1

测试输入:



  1. abc

预期输出:



  1. String type

  2. Create binary sort tree success!

  3. Inorder traversal:

  4. a,add,art,bad,be,bed,bee,cab,dad,db,db,ebb,

  5. Preorder traversal:

  6. bed,add,a,bad,art,be,bee,ebb,cab,dad,db,db,

  7. Search an element at the tree,input key:

  8. abc

  9. Not exist!The number of times to find this element is: 4
#include "BinSortTree.h"

/***********************************
 *	Copyright(c) 2016-2099 CTGU YOUNGMIEN
 *  All rights reserved.

 *	Version: v1.0
 *	Author: YOUNGMIEN
 *	Date: 16/04/20
 *	Company: CTGU
 *
 *	fileName: BinSortTree.cpp 
 *	Descripton: 任务文件 
 *
 *******************************/


/* Round 1
由文件生成二叉排序树
如文件数据如下:
18 14 7 3 11 22 35 27
生成BST中序遍历得到序列如下:
3,7,11,14,18,22,27,35, 

@param fileName:string, file name 
*/
template <typename T>
void BinSortTree<T>::createBSTFromFile(ifstream &ifs){
    /*************** Begin ****************/
        //ifstream ifs(fileName.c_str());
        T e;
        if(ifs.good()){
            ifs >> e;
        }
        mp_root = new BinTNode<T>(e);
        
        while(ifs.good()){
            ifs >> e;
            insert(mp_root, e);
        }    
    /*************** End ****************/
    } // --- createBSTFromFile() END 
/*Round 1
=== 在根为cur的二叉树中插入元素e 
*/
template<typename T>
void BinSortTree<T>:: insert(BinTNode<T> * cur, T e){
    /*************** Begin ****************/
        //生成新结点 
        BinTNode<T> * newNode = new BinTNode<T>(e);
        //循环查找,直到找到newNode要插入的位置
        while(1) { //大则向左、小则向右
            if(moreThan(newNode, cur)){ //newNode > cur
                if(cur->m_right != NULL){
                    cur = cur->m_right;
                }
                else{ //cur 没有 右孩子
                    //找到
                    cur->m_right = newNode;
                    break; 
                }            
            } //newNode > cur END
            else{ //newNode <= cur
                if(cur->m_left != NULL){
                    cur = cur->m_left;
                }
                else{ //cur 没有 左孩子
                    //找到
                    cur->m_left = newNode;
                    break; 
                }            
            } 
        } 
    /*************** End ****************/    
}//insert() END
	
/* Round 2 
===searchTimes:在根为start中查找元素e,返回查找的次数 

@param start: 子树的根结点
@param e: 元素 
@param exist:查找结果, true,存在;false,不存在 
@return 查找所花费的次数 
*/
template<typename T>
int BinSortTree<T>::searchTimes(BinTNode<T> * start, T e, bool &exist){
        /*************** Begin ****************/
        
        if(NULL == start ){
            exist = false; 
            return 1;
        }
        else if(!cmpType(start->m_data,e) ){
            exist = true;
            return 1;
        }
        else if(cmpType(start->m_data, e) < 0){ 
            return 1+searchTimes(start->m_right, e, exist);
        } 
        else{ 
            return 1+searchTimes(start->m_left, e, exist);
        }
        /*************** End ****************/
    } 
/* Round 3
 === 删除,在根为start中删除元素e,成功返回true否则为false
 @param start: BinTNode<T> * &,引用类型
 @param e:T,element
 @return :true,树中存在该元素;false,不存在 
*/
    template<typename T>
    bool BinSortTree<T>::removeFromBST(BinTNode<T> * & start, T e){
        /*************** Begin ****************/
            if(NULL == start){
                return false;
            }
            else{
                //查找 
                
                if( !cmpType(start->m_data,e) ){
                    delBSTNode(start);
                    return true;
                }
                else if(cmpType(start->m_data,e) > 0){
                    return    removeFromBST(start->m_left, e);
                }
                else{ 
                    return removeFromBST(start->m_right, e);
                }
            } 
        /*************** End ****************/
        }
    /*===在二叉排序树中删除cur删除结点 
    @param cur, BinTNode<T> * &,引用类型,写操作 
    */
    template<typename T>
    void BinSortTree<T>:: delBSTNode(BinTNode<T> *  & cur){
        /*************** Begin ****************/
            BinTNode<T> * tmp = cur;
            if(NULL == cur->m_left){
                cur = cur->m_right; 
                delete tmp; 
            } 
            else if(NULL == cur->m_right){
                cur = cur->m_left;
                delete tmp; 
            }
            else{ 
                BinTNode<T> * start = cur;
                tmp = cur->m_left;
                while(tmp->m_right != NULL){ 
                    start = tmp;
                    tmp = tmp->m_right;
                }
                
                cur->m_data = tmp->m_data;
                
                 if(start != cur){ 
                     start->m_right = tmp->m_left;
                }
                else{ 
                    cur->m_left = tmp->m_left;
                } 
                delete tmp;
            }
            /*************** End ****************/    
        }

第3关:在二叉排序树中删除元素e,若存在就删除它并返回true,否则返回false

任务描述

任务描述:在二叉排序树中删除元素 e,若存在就删除它并返回 true,否则返回 false。

测试说明

平台会对你的代码进行测试。 文件 bstDataString.txt 内容如下:



  1. bed bee add bad ebb cab dad be a art db

测试输入:



  1. add

预期输出:



  1. String type

  2. Create binary sort tree success!

  3. Inorder traversal:

  4. a,add,art,bad,be,bed,bee,cab,dad,db,db,ebb,

  5. Preorder traversal:

  6. bed,add,a,bad,art,be,bee,ebb,cab,dad,db,db,

  7. Remove an element from the tree,input key:

  8. add

  9. add Exist,Delete element success!

  10. After deleting

  11. Inorder traversal:

  12. a,art,bad,be,bed,bee,cab,dad,db,db,ebb,

  13. Preorder traversal:

  14. bed,a,bad,art,be,bee,ebb,cab,dad,db,db,
#include "BinSortTree.h"

/***********************************
 *	Copyright(c) 2016-2099 CTGU YOUNGMIEN
 *  All rights reserved.

 *	Version: v1.0
 *	Author: YOUNGMIEN
 *	Date: 16/04/20
 *	Company: CTGU
 *
 *	fileName: BinSortTree.cpp 
 *	Descripton: 任务文件 
 *
 *******************************/


/* Round 1
由文件生成二叉排序树
如文件数据如下:
18 14 7 3 11 22 35 27
生成BST中序遍历得到序列如下:
3,7,11,14,18,22,27,35, 

@param fileName:string, file name 
*/
template <typename T>
void BinSortTree<T>::createBSTFromFile(ifstream &ifs){
    /*************** Begin ****************/
        //ifstream ifs(fileName.c_str());
        T e;
        if(ifs.good()){
            ifs >> e;
        }
        mp_root = new BinTNode<T>(e);
        
        while(ifs.good()){
            ifs >> e;
            insert(mp_root, e);
        }    
    /*************** End ****************/
    } // --- createBSTFromFile() END 
/*Round 1
=== 在根为cur的二叉树中插入元素e 
*/
template<typename T>
void BinSortTree<T>:: insert(BinTNode<T> * cur, T e){
    /*************** Begin ****************/
        //生成新结点 
        BinTNode<T> * newNode = new BinTNode<T>(e);
        //循环查找,直到找到newNode要插入的位置
        while(1) { //大则向左、小则向右
            if(moreThan(newNode, cur)){ //newNode > cur
                if(cur->m_right != NULL){
                    cur = cur->m_right;
                }
                else{ //cur 没有 右孩子
                    //找到
                    cur->m_right = newNode;
                    break; 
                }            
            } //newNode > cur END
            else{ //newNode <= cur
                if(cur->m_left != NULL){
                    cur = cur->m_left;
                }
                else{ //cur 没有 左孩子
                    //找到
                    cur->m_left = newNode;
                    break; 
                }            
            } 
        } 
    /*************** End ****************/    
}//insert() END
	
/* Round 2 
===searchTimes:在根为start中查找元素e,返回查找的次数 

@param start: 子树的根结点
@param e: 元素 
@param exist:查找结果, true,存在;false,不存在 
@return 查找所花费的次数 
*/
template<typename T>
int BinSortTree<T>::searchTimes(BinTNode<T> * start, T e, bool &exist){
        /*************** Begin ****************/
        
        if(NULL == start ){
            exist = false; 
            return 1;
        }
        else if(!cmpType(start->m_data,e) ){
            exist = true;
            return 1;
        }
        else if(cmpType(start->m_data, e) < 0){ 
            return 1+searchTimes(start->m_right, e, exist);
        } 
        else{ 
            return 1+searchTimes(start->m_left, e, exist);
        }
        /*************** End ****************/
    } 
/* Round 3
 === 删除,在根为start中删除元素e,成功返回true否则为false
 @param start: BinTNode<T> * &,引用类型
 @param e:T,element
 @return :true,树中存在该元素;false,不存在 
*/
    template<typename T>
    bool BinSortTree<T>::removeFromBST(BinTNode<T> * & start, T e){
        /*************** Begin ****************/
            if(NULL == start){
                return false;
            }
            else{
                //查找 
                
                if( !cmpType(start->m_data,e) ){
                    delBSTNode(start);
                    return true;
                }
                else if(cmpType(start->m_data,e) > 0){
                    return    removeFromBST(start->m_left, e);
                }
                else{ 
                    return removeFromBST(start->m_right, e);
                }
            } 
        /*************** End ****************/
        }
    /*===在二叉排序树中删除cur删除结点 
    @param cur, BinTNode<T> * &,引用类型,写操作 
    */
    template<typename T>
    void BinSortTree<T>:: delBSTNode(BinTNode<T> *  & cur){
        /*************** Begin ****************/
            BinTNode<T> * tmp = cur;
            if(NULL == cur->m_left){
                cur = cur->m_right; 
                delete tmp; 
            } 
            else if(NULL == cur->m_right){
                cur = cur->m_left;
                delete tmp; 
            }
            else{ 
                BinTNode<T> * start = cur;
                tmp = cur->m_left;
                while(tmp->m_right != NULL){ 
                    start = tmp;
                    tmp = tmp->m_right;
                }
                
                cur->m_data = tmp->m_data;
                
                 if(start != cur){ 
                     start->m_right = tmp->m_left;
                }
                else{ 
                    cur->m_left = tmp->m_left;
                } 
                delete tmp;
            }
            /*************** End ****************/    
        }



版权声明:本文为weixin_63423226原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。