源码系列:二叉排序树

binary_search_tree.cpp

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>

using namespace std;

namespace algo
{
    template<typename T>
    class BinarySearchTree
    {
    private:
        struct _Node
        {
            T value;
            _Node *left;
            _Node *right;
        };

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

        ~BinarySearchTree()
        {
            _RecursiveReleaseNode(_root);
        }

        bool Create(vector<T> &vec)
        {
            for(vector<T>::iterator iter = vec.begin();iter != vec.end();iter++)
            {
                if(!Insert(*iter))
                {
                    return false;
                }
            }
            return true;
        }

        bool Insert(T data)
        {
            _Node *node = new _Node();
            if(node == NULL)
            {
                cout << "空间不足!分配失败!\n" << endl;
                return false;
            }
            node->value = data;
            node->left = NULL;
            node->right = NULL;

            _Node *current_node = _root;
            _Node *parent_node = current_node;
            int flag = 0;

            if(current_node == NULL)
            {
                _root = node;
            }
            else
            {
                while(current_node)
                {
                    if(data < current_node->value)
                    {
                        parent_node = current_node;
                        current_node = current_node->left;
                        flag = 0;
                    }
                    else
                    {
                        parent_node = current_node;
                        current_node = current_node->right;
                        flag = 1;
                    }
                }

                if(flag == 0)
                {
                    parent_node->left = node;
                }
                else
                {
                    parent_node->right = node;
                }
            }

            return true;
        }

        bool Search(T data)
        {
            if(!_root)
            {
                return false;
            }

            _Node *current_node = _root;
            while(current_node)
            {
                if(data == current_node->value)
                {
                    cout << "找到" << data << endl;
                    break;
                }else if(data < current_node->value)
                {
                    current_node = current_node->left;
                }else
                {
                    current_node = current_node->right;
                }
            }
            if(current_node == NULL)
                return false;
            return true;
        }

        bool Delete(T data)
        {
            return _Delete(_root,data);
        }

        void Display()
        {
            _Display(_root);
        }

    private:
        bool _Delete(_Node *&node,T data)
        {
            if(!_root)
                return false;

            if(data == node->value)
            {
                if(node->left == NULL && node->right == NULL)
                {
                    delete node;
                    node = NULL;
                }
                else if(node->left != NULL && node->right == NULL)
                {
                    _Node *temp = node->left;
                    delete node;
                    node = temp;
                }
                else if(node->left == NULL && node->right != NULL)
                {
                    _Node *temp = node->right;
                    delete node;
                    node = temp;
                }
                else
                {
                    _Node *current_node = node->left;
                    _Node *parent_node = NULL;
                    while(current_node->right != NULL)
                    {
                        parent_node = current_node;
                        current_node = current_node->right;
                    }

                    node->value = current_node->value;
                    if(parent_node)
                    {
                        parent_node->right = current_node->left;
                    }
                    else
                    {
                        node->left = current_node->left;
                    }
                    delete current_node;
                }
                return true;
            }
            else if(data < node->value)
                return _Delete(node->left,data);
            else
                return _Delete(node->right,data);
        }

        void _Display(_Node *node)
        {
            if(node)
            {
                _Display(node->left);
                cout << node->value << "\t";
                _Display(node->right);
            }
        }

        void _RecursiveReleaseNode(_Node* node)
        {
            if(node)
            {
                _RecursiveReleaseNode(node->left);
                _RecursiveReleaseNode(node->right);
                delete node;
            }
        }
        _Node *_root;
    };
}


测试程序:

#include <iostream>
#include "binary_search_tree.cpp"

using namespace std;

int main()
{
    algo::BinarySearchTree<int> bst;
    int data[8] = {13,15,6,20,14,5,7,18};
    vector<int> vec(data,data+sizeof(data)/sizeof(int));
    bst.Create(vec);
    bst.Display();

    cout << endl;
    bst.Delete(20);
    bst.Display();

    cout << endl;
    bst.Delete(15);
    bst.Display();

    cout << endl;
    bst.Delete(13);
    bst.Display();
    return 0;
}
测试所用BST:


测试结果:



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值