码迷,mamicode.com
首页 > 其他好文 > 详细

二叉查找树实现-双向链表

时间:2015-07-02 17:02:55      阅读:107      评论:0      收藏:0      [点我收藏+]

标签:

////二叉查找树,为了实现方便,给每个节点添加了一个指向父节点的指针
#include<iostream>
#include<vector>
#include<ctime>
#include<cstdlib>

using namespace std;

template<class T>
class BinarySearchTree
{
    private:
        struct Node
        {
            T data;
            int deep;
            Node *left;
            Node *right;
            Node *prev;
            Node(T val,int deep)
            {
                data = val;
                deep = 0;
                left = NULL;
                right = NULL;
                prev = NULL;
            }

            private:
            Node()
            {
            }
        };
        Node *root;
        int size;

    public:
        BinarySearchTree()
        {
            root = NULL;
            size = 0;
        }
        ~BinarySearchTree()
        {
            clear(root);
            root = NULL;
            size = 0;
        }
        T min(Node *node) const
        {
            if(node->left == NULL)
                return node->data;
            else
                return min(node->left);
        }
        T max(Node *node) const
        {
            if(node->right == NULL)
                return node->data;
            else
                return max(node->right);
        }

        Node *insert(Node *& node,T val)
        {
            if(size == 0 && node == NULL)
            {
                root = new Node(val,0);
                root->prev = NULL;
                size++;
                return root;
            }
            if(size != 0 && node == NULL)
            {
                cout<<"ERROR\n";
                return NULL;
            }
            if(val > node->data)
            {
                if(node->right != NULL)
                    return insert(node->right,val);
                else
                {
                    Node *tmp = new Node(val,node->deep+1);
                    tmp->prev = node;
                    node->right = tmp;
                    size++;
                    return tmp;
                }    
            }
            else if(val < node->data)
            {
                if(node->left != NULL)
                    return insert(node->left,val);
                else
                {
                    Node *tmp = new Node(val,node->deep+1);
                    tmp->prev = node;
                    node->left = tmp;
                    size ++;
                    return tmp;
                }
            }
            else if(val == node->data)
            {
            }
        }

        bool contain(Node *node,T val) const
        {
            if(node == NULL)
                return false;

            if(val > node->data)
                return contain(node->right,val);
            else if(val < node->data)
                return contain(node->left,val);
            else
                return true;
        }
        void removeNode(Node *node)
        {
            if(node->left == NULL && node->right == NULL)
            {
                if(node->prev->left == node)
                    node->prev->left = NULL;
                else
                    node->prev->right = NULL;

                delete node;
                size--;
            }
            else if(node->left == NULL)
            {
                node->right->prev = node->prev;
                if(node->prev->left == node)
                    node->prev->left = node->right;
                else
                    node->prev->right = node->right;

                decDeep(node->right);
                delete node;
                size--;
            }
            else if(node->right == NULL)
            {
                node->left->prev = node->prev;
                if(node->prev->left == node)
                    node->prev->left = node->left;
                else
                    node->prev->right = node->left;

                decDeep(node->left);
                delete node;
                size--;
            }
            else
            {
                Node *p = node->right;
                while(p->left != NULL)
                {
                    p=p->left;
                }
                node->data = p->data;
                if(p->right != NULL)
                {
                    p->prev->left = p->right;
                    p->right->prev = p->prev;
                    decDeep(p->right);
                    delete p;
                    size--;
                }
                else
                {
                    p->prev->left = NULL;
                    delete p;
                    size--;
                }
            }
        }
        void decDeep(Node *node)
        {
            node->deep--;
            if(node->left != NULL)
                decDeep(node->left);
            if(node->right != NULL)
                decDeep(node->right);
        }
        void remove(T val)
        {
            Node * p=root;
            while(1)
            {
                if(val > p->data)
                    p = p->right;
                else if(val < p->data)
                    p = p->left;
                else if(val == p->data)
                {
                    
                    removeNode(p);
                    return;
                }
            }
        }
        void clear(Node*node)
        {
            if(node->left != NULL)
                clear(node->left);
            if(node->right != NULL)
                clear(node->right);

            delete node;
            node = NULL;
        }
        void print(Node *node)
        {
            if(node == NULL)
                return;
            cout<<node->data<< " ";
            if(node->left != NULL)
                print(node->left);
            if(node->right != NULL)
                print(node->right);
        }
        void insert(T val)
        {
            insert(root,val);
        }
        void print()
        {
            print(root);
            cout<<"\n";
        }
};

int main()
{
    BinarySearchTree<int> tree;
    tree.insert(10);
    tree.insert(1);
    tree.insert(11);
    tree.insert(9);
    tree.insert(8);
    tree.print();
    cout<<"\n\n";
    tree.remove(9);
    tree.print();

    return 0;
}

二叉查找树实现-双向链表

标签:

原文地址:http://www.cnblogs.com/jkred369/p/4616283.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!