二叉搜索树

二叉搜索树是这样定义的:
左子树如果有,key值都比根节点的key值小,
右子树如果有,key值都比根节点的key值大,
左子树和右子树都是二叉搜索树;
模拟实现一个模板类BSTree.hpp实现搜索二叉树的一些基本功能

#pragma once
#include<iostream>

template<class K>
struct BSTreeNode
{
    BSTreeNode(const K& key) :_key(key), _left(NULL), _right(NULL){}
    K _key;
    BSTreeNode* _left;
    BSTreeNode* _right;
};


template<class K>
class BSTree
{
    typedef BSTreeNode<K> Node;

public:
    BSTree() :_root(NULL){}

    BSTree(const BSTree & t)
    {
        _copy(t._root);
    }

    void InOrder()
    {
        _InOrder(_root);
        std::cout << std::endl;
    }
    bool InsertR(const K& key)//递归
    {
        return _InsertR(_root, key);
    }

    bool Insert(const K& key)
    {
        if (_root == NULL)
        {
            _root = new Node(key);
        }
        else
        {
            Node* parent = NULL;
            Node* root = _root;
            while (root)
            {
                parent = root;
                if (key > root->_key)
                    root = root->_right;
                else if (key < root->_key)
                    root = root->_left;
                else
                    return false;
            }

            if (key < parent->_key)
                parent->_left = new Node(key);
            else 
                parent->_right = new Node(key);
        }
        return true;
    }

    bool RemoveR(const K& key)//递归
    {
        return _RemoveR(_root, key);
    }

    bool Remove(const K& key)
    {
        Node* parent = _root;
        Node* root = _root;
        while (root)
        {
            if (key > root->_key)
            {
                parent = root;
                root = root->_right;
            }
            else if (key < root->_key)
            {
                parent = root;
                root = root->_left;
            }
            else
            {
                break;
            }
        }//找到要删除的位置
        Node* del = root;
        if (root == NULL)
            return false;//没找到位置
        if (root->_left == NULL)
        {
            if (root == _root)
                _root = _root->_right;
            else
            {
                if (root == parent->_right)
                    parent->_right = root->_right;//要删除的点左边没东西,让父节点指向它的右节点即可;
                else
                    parent->_left = root->_left;
            }

        }
        else if (root->_right == NULL)
        {
            if (root == _root)
                _root = _root->_left;
            else
            {
                if (root == parent->_right)
                    parent->_right = root->_right;
                else
                    parent->_left = root->_left;
            }
        }
        else
        {
            Node* rootL = root->_left;
            parent = root;
            while (rootL->_right)//左右两边都有节点,找左边最大的节点
            {
                parent = rootL;
                rootL = rootL->_right;
            }
            root->_key = rootL->_key;
            del = rootL;
            if (root == parent->_right)
                parent->_right = rootL->_left;
            else
                parent->_left = rootL->_left;
        }
        delete del;
        del = NULL;
        return true;
    }

    Node* FindR(const K& key)
    {
        return _FindR(_root, key);
    }

    Node* Find(const K& key)
    {
        Node* root = _root;
        while (root)
        {
            if (key > root->_key)
                root = root->_right;
            else if (key < root->_key)
                root = root->_left;
            else
                return root;
        }
        return root;
    }

    ~BSTree()
    {
        _delete(_root);
    }
private:

    Node* _FindR(Node* root, const K& key)
    {
        if (root == NULL)
            return NULL;
        if (key > root->_key)
            return _FindR(root->_right, key);
        else if (key < root->_key)
            return _FindR(root->_left, key);
        else
            return root;
    }

    bool _RemoveR(Node* &root, const K& key)
    {
        if (root == NULL)
            return false;

        if (key > root->_key)
            return _RemoveR(root->_right, key);
        else if (key < root->_key)
            return _RemoveR(root->_left, key);
        else
        {
            Node* del = root;
            if (root->_left == NULL)
            {
                root = root->_right;
            }
            else if (root->_right == NULL)
            {
                root = root->_left;
            }
            else
            {
                Node* parent = root;
                Node* left = root->_left;
                while (left->_right)
                {
                    parent = left;
                    left = left->_right;
                }
                del = left;
                root->_key = left->_key;
                if (left == parent->_right)
                    parent->_right = left->_left;
                else
                    parent->_left = left->_left;
            }
            delete del;
        }
        return true;
    }

    bool _InsertR(Node*& root, const K& key)
    {
        if (root == NULL)
            root = new Node(key);
        if (key > root->_key)
            return _InsertR(root->_right, key);
        else if (key < root->_key)
            return _InsertR(root->_left, key);
        else
            return false;
    }

    void _InOrder(Node* root)
    {
        if (root)
        {
            _InOrder(root->_left);
            std::cout << root->_key << " ";
            _InOrder(root->_right);
        }
    }

    void _copy(Node* root)
    {
        if (root == NULL)
            return;
        Node *_root = new Node(root->_key);
        _root->_left = NULL;
        _root->_right = NULL;
        if (root->_left)
            _copy(root->_left);
        if (root->_right)
            _copy(root->_right);
    }

    void _delete(Node*& root)
    {
        if (root != NULL)
        {
            _delete(root->_left);
            _delete(root->_right);
            delete root;
            root = NULL;
        }
    }

protected:
    Node* _root;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值