二叉搜索树

一颗二叉搜索树【像二分,但不是】
满足条件:左子树比根小,右子树比根大

又可以叫排序二叉树:中序遍历就是排序
 
//二叉搜索树
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;
public: 
    bool Insert(const  K&  key)
    {
        if(_root == nullptr)
        {
            _root = new  Node(key);
            return  true;
        }
        Node*  parent = nullptr;
        Node* cur = _root;
        while(cur)
        {
            if(cur->_key<key)
            {
                parent = cur;
                cur = cur -> _right;
            }
            else i f(cur->_key>key)
            {
                parent = cur;
                cur = cur -> _left;
            }
            else
            {
                return false;
            }
        }
        
        cur = new Node(key);
        if(parent->_key  < key)
        {
            parent->_right = cur;
        }
        else
        {
            parent->_left = cur;
        }
        
        return  true;
    }
    
    bool  Find(const K& key)
    {
        if(_root == nullptr)
        {
            _root = new  Node(key);
            return  true;
        }
        Node* cur = _root;
        while(cur)
        {
            if(cur->_key<key)
            {
                cur = cur -> _right;
            }
            else i f(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 i f(cur->_key>key)
            {
                parent = cur;
                cur = cur -> _left;
            }
            else
            {
                if(cur->_left == nullptr)//左为空
                {
                    if(cur == _root)
                    {
                        _root = cur ->_right;
                    }
                    else
                    {
                        if(cur == parent->_left)
                        {
                            parent->_left = cur->_right;
                        }
                        else
                        {
                            parent->right = cur->_right;
                        }

                    }
                    
                    delete cur;
                }    
                else if(cur->_right == nullptr)//右为空
                {
                    if(cur == _root)
                    {
                        _root = cur ->_left;
                    }
                    
                    else
                    {
                        if(cur == parent->_left)
                        {
                            parent->_left = cur->_left;
                        }
                        else
                        {
                            parent->_right = cur->_left;
                        }
    
                        }
                    
                    delete cur;
                }

                else
                {
                    //左右都不为空
                    Node* rightMinParent = cur; 
                    Node*  rightMin  =  cur->_right;
                    while(rightMIn->_left)
                    {
                        rightMinParent = rightMin;
                        rightMin = rightMin->_left;
                    }
                    swap(cur->_key,rightMin->_key);
                    if(rightMinParen->_left == rightMin)
                        rightMinParent->_left = rightMin->_right;
                    else
                        rightMinParent->_right = rightMin->_right;
                    delete  rightMin;
                }
                return true;
            }
        return false;
    }
    
    void  InOrder()
    {
        _InOrder(_root);
    }
private:        //套一层壳
    void  _InOrder(Node*  root )
    {
        if(root==nullptr)
        {
            return;
        } 
        InOrder(_root->_left);
        cout <<  root->_key  << " ";
        InOrder(_root->_right);
    }
    
private:
    Node*  _root  = nullptr;
};

/
查找:
二分查找
二叉搜索树查找    AVL树和红黑树
哈希查找
跳表
多叉搜索树查找    B树系列

基本都为K模型和KV模型


KV树


 
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 i f(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)
    {
        if(_root == nullptr)
        {
            _root = new  Node(key);
            return  true;
        }
        Node* cur = _root;
        while(cur)
        {
            if(cur->_key<key)
            {
                cur = cur -> _right;
            }
            else i f(cur->_key>key)
            {
                cur = cur -> _left;
            }
            else
            {
                cout << "查无此单词" << endl;
            }
        }
                
        return  cur;
    } 

    //替换法:找一个节点替代你,左子树最大节点或者右子树最小节点
    bool  Erase(const K&  key)        
    {
        Node*  parent = nullptr;
        Node* cur = _root;
        while(cur)
        {
            if(cur->_key<key)
            {
                parent = cur;
                cur = cur -> _right;
            }
            else i f(cur->_key>key)
            {
                parent = cur;
                cur = cur -> _left;
            }
            else
            {
                if(cur->_left == nullptr)//左为空
                {
                    if(cur == _root)
                    {
                        _root = cur ->_right;
                    }
                    else
                    {
                        if(cur == parent->_left)
                        {
                            parent->_left = cur->_right;
                        }
                        else
                        {
                            parent->right = cur->_right;
                        }

                    }
                    
                    delete cur;
                }    
                else if(cur->_right == nullptr)//右为空
                {
                    if(cur == _root)
                    {
                        _root = cur ->_left;
                    }
                    
                    else
                    {
                        if(cur == parent->_left)
                        {
                            parent->_left = cur->_left;
                        }
                        else
                        {
                            parent->_right = cur->_left;
                        }
    
                        }
                    
                    delete cur;
                }

                else
                {
                    //左右都不为空
                    Node* rightMinParent = cur; 
                    Node*  rightMin  =  cur->_right;
                    while(rightMIn->_left)
                    {
                        rightMinParent = rightMin;
                        rightMin = rightMin->_left;
                    }
                    swap(cur->_key,rightMin->_key);
                    if(rightMinParen->_left == rightMin)
                        rightMinParent->_left = rightMin->_right;
                    else
                        rightMinParent->_right = rightMin->_right;
                    delete  rightMin;
                }
                return true;
            }
        return false;
    }
    
    void  InOrder()
    {
        _InOrder(_root);
    }
private:        //套一层壳
    void  _InOrder(Node*  root )
    {
        if(root==nullptr)
        {
            return;
        } 
        InOrder(_root->_left);
        cout <<  root->_key  << " ";
        InOrder(_root->_right);
    }
    
private:
    Node*  _root  = nullptr;
};


搜索树接近有序插入,会从logN退化成N
所以出现了平衡搜索二叉树
 

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值