zoukankan      html  css  js  c++  java
  • 算法-搜索(2)二叉搜索树

    #include <iostream>
    #include <stdlib.h>
    using namespace std;
    
    template <class E,class K>
    struct BSTNode{
        E data;
        BSTNode<E,K> *left,*right;
        BSTNode():left(NULL),right(NULL){}
        BSTNode(const E d,BSTNode<E,K> *L=NULL,BSTNode<E,K> *R=NULL):data(d),left(L),right(R){}
        ~BSTNode(){}
        void setData(E d){data=d;}
        E getData(){return data;}
    };
    
    template <class E,class K>
    class BST{
    public:
        BST():root(NULL){}
        BST(K value);
        ~BST(){}
        bool Search(const K x) const{
            return(Search(x,root)!=NULL)?true:false;
        }
        BST<E,K>&operator=(const BST<E,K>& R);
        void makeEmpty(){makeEmpty(root);root=NULL;}
        void PrintTree()const{PrintTree(root);}
        E Min(){return Min(root)->data;}
        E Max(){return Max(root)->data;}
        bool Insert(const E& el){return Insert(el,root);}
        bool Remove(const K x){return Remove(x,root);}
    private:
        BSTNode<E,K> *root;
        K RefValue;
        BSTNode<E,K> *Search(const K x,BSTNode<E,K> *ptr) const;
        void makeEmpty(BSTNode<E,K> *&ptr);
        void PrintTree(BSTNode<E,K> *ptr) const;
        BSTNode<E,K> *Copy(const BSTNode<E,K> *ptr);
        BSTNode<E,K> *Min(BSTNode<E,K> *ptr) const;
        BSTNode<E,K> *Max(BSTNode<E,K> *ptr) const;
        bool Insert(const E& el,BSTNode<E,K> *&ptr);
        bool Remove(const K x,BSTNode<E,K> *&ptr);
    };
    
    template <class E,class K>
    BSTNode<E,K> *BST<E,K>::Search(const K x, BSTNode<E, K> *ptr) const {
        //私有递归函数,在以ptr为根的二叉树中搜索含x的结点,若找到则返回地址,否则返回NULL
        if(ptr==NULL) return NULL;
        else if(x<ptr->data) return Search(x,ptr->left);
        else if(x>ptr->data) return Search(x,ptr->right);
        else return ptr;
    }
    
    
    //使用插入算法前应先用搜索算法检测有没有
    template <class E,class K>
    bool BST<E,K>::Insert(const E &el, BSTNode<E, K>& *ptr) {
        //私有函数,在以ptr为根的二叉搜索树中插入所含值为el的结点
        if(ptr==NULL){   //当ptr为NULL时即为我们要找的插入的地方
            ptr=new BSTNode<E,K>(el);
            if(ptr==NULL){
                cerr<<"Out of space"<<endl;
                exit(1);
            }
            return true;
        }
        //当ptr不为NULL时它一定指向一颗子树的根
        else if(el<ptr->data) Insert(el,ptr->left);
        else if(el>ptr->data) Insert(el,ptr->right);
        else return false;
    }
    
    template <class E,class K>
    BST<E,K>::BST(K value){
        //输入一个元素序列,建立一颗二叉搜索树
        E x;
        root=NULL;
        RefValue=value;
        cin>>x;
        while(x.key!=RefValue){   //RefValue是一个输入结束标志,输入序列以输入一个结束标志value结束
            Insert(x,root);
            cin>>x;
        }
    };
    
    template <class E,class K>
    bool BST<E,K>::Remove(const K x, BSTNode<E, K>* &ptr) {
        //删除结点时,必须把断开的二叉链表重新链接,同时确保二叉搜索树性质不丢失、同时防止重链后树高度增加。
        BSTNode<E,K> *temp;
        if(ptr!=NULL){
            if(x<ptr->data) Remove(x,ptr->left);
            else if(x>ptr->data) Remove(x,ptr->right);
            else if(ptr->left!=NULL && ptr->right!=NULL){   //ptr指示关键码即为所寻,它有两个子女
                temp=ptr->right;
                while(temp->left!=NULL) temp=temp->left;   //到右子女搜索中序下第一个结点(关键码最小)
                ptr->data=temp->data;                      //两个结点互相交换关键码、再删了那个结点
                Remove(ptr->data,ptr->right);
            }
            else{   //ptr指示关键码即为所寻,它有一个子女,拿该子女顶替它;或者它是叶结点,直接删除即可
                temp=ptr;
                if(ptr->left==NULL) ptr=ptr->right;
                else ptr=ptr->left;
                delete temp;
                return true;
            }
        }
        return false;    //ptr为空指针或者找不到关键码为x的结点
    }
  • 相关阅读:
    C# 面向对象之概念理解(2)
    Linux中常用常用常用快捷键
    shell基本脚本命令
    awk命令详解及应用技巧
    Windows(64位IIS)未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序
    基础知识(net)<3> virtural , new ,override
    WCF REST<2>: 消费WCF REST 服务
    智能表单(2):简单使用HtmlEditor
    智能表单(1) : 开源HtmlEditor介绍
    ASP.NET Web API <2> 跨域消费Web API(JSONP)
  • 原文地址:https://www.cnblogs.com/yangyuliufeng/p/9237469.html
Copyright © 2011-2022 走看看