Introduction to Algorithms Chapter 12: Binary Search Tree

//

//  main.cpp

//  Data Structure TRY1

//

//  Created by zr9558 on 6/7/13.

//  Copyright (c) 2013 zr9558. All rights reserved.

//



// Introduction to Algorithms: Chapter 12 Binary Search Tree



#include<iostream>

using namespace std;

#include<math.h>


template<typename Comparable>

class BinarySearchTree

{

public:

    BinarySearchTree()

    {

       root=NULL;

    }

    

    BinarySearchTree(const BinarySearchTree &rhs)

    {

        

       root=clone(rhs.root);

    }

    

    constBinarySearchTree & operator=(const BinarySearchTree &rhs)

    {

       if( this!=&rhs)

        {

           makeEmpty(root);

           root=clone(rhs.root);

        }

       return *this;

    }

    

    ~BinarySearchTree()

    {

        makeEmpty(root);

    }

    

   const Comparable &findMin() const

    {

        returnTree_Minimum(root)->key;

    }

    

   const Comparable &findMax() const

    {

        returnTree_Maximum(root)->key;

    }

    

   bool contains( const Comparable x)const

    {

       if( Tree_Search(root,x)==NULL)return false;

        else return true;

    }

    

   void insert( const Comparable &x)

    {

       TreeNode *tt=newTreeNode(x, NULL,NULL, NULL);

       Tree_Insert(tt);

    }

    

   void remove( const Comparable &x)

    {

       TreeNode *tt=Tree_Search(root, x);

        

       if( tt!=NULL)

        {

           TreeNode *p=Tree_Delete(tt);

           delete p;

        }

    }

    

   void print()

    {

       Print(root,0);

    }

    

   void printInOrder()

    {

        PrintInOrder(root);

       cout<<endl;

    }

    

private:

   struct TreeNode

    {

        Comparable key;

       TreeNode *left, *right, *parent;

        

        TreeNode(const Comparable & x=Comparable(), TreeNode *lt=NULL, TreeNode *rt=NULL, TreeNode *pt=NULL)

        :key(x), left(lt),right(rt), parent(pt){}

    };

    

   TreeNode *root;

    

   TreeNode *Tree_Search( TreeNode *t, Comparable x) const

    {

       if( t==NULL || t->key==x)return t;

       else if( x< t->key)return Tree_Search(t->left, x);

       else returnTree_Search(t->right, x);

    }

    

   TreeNode *Tree_Minimum( TreeNode *t) const

    {

       while( t->left!=NULL)

            t=t->left;

        

       return t;

    }

    

   TreeNode *Tree_Maximum( TreeNode *t) const

    {

       while( t->right!=NULL)

            t=t->right;

        

       return t;

    }

    

   TreeNode *Tree_Successor( TreeNode *x) const

    {

       if( x->right!=NULL)

           return Tree_Minimum(x->right);

        

       TreeNode *y=x->parent;

        

       while( y!=NULL && x==y->right)

        {

            x=y; y=y->parent;

        }

       return y;

    }

    

   TreeNode *Tree_Predecessor( TreeNode *x) const 

    {

       if( x->left!=NULL)

           return Tree_Maximum(x->left);

        

       TreeNode *y=x->parent;

       while( y!=NULL && x==y->left)

        {

            x=y; y=y->parent;

        }

       return y;

    }

    

   void Tree_Insert( TreeNode *z)

    {

       TreeNode *y=NULL;

       TreeNode *x=root;

        

       while( x!=NULL)

        {

            y=x;

           if( z->key < x->key) x=x->left;

           else x=x->right;

        }

        

        z->parent=y;

       if( y==NULL)root=z;

       else if( z->key < y->key) y->left=z;

       else y->right=z;

        

    }

    

   TreeNode *Tree_Delete( TreeNode *z)

    {

       TreeNode *y=NULL;

       if( z->left==NULL || z->right==NULL)

            y=z;

       else y=Tree_Successor(z);

        

       TreeNode *x=NULL;

       if( y->left==NULL)

            x=y->left;

       else x=y->right;

        

       if( x!=NULL)

            x->parent=y->parent;

        

       if( y->parent==NULL)

           root=x;

       else if( y==y->parent->left)

            y->parent->left=x;

       else y->parent->right=x;

        

       if( y!=z)

            z->key=y->key;

        

       return y;

    }

    

   TreeNode *clone( TreeNode *t)const

    {

       if( t==NULL)return NULL;

       else returnnew TreeNode(t->key,clone(t->left),clone(t->right), t->parent);

    }

    

   void makeEmpty( TreeNode *t)

    {

       if( t!=NULL)

        {

           makeEmpty(t->left);

           makeEmpty(t->right);

           delete t;

        }

    }

    

   void Print( TreeNode *t,int level)

    {

       if( t!=NULL)

        {

           Print(t->right,level+1);

           for( int i=0; i<4*level; ++i)

               cout<<" ";

           cout<<t->key<<endl;

           Print(t->left,level+1);

        }

    }

    

   void PrintInOrder( TreeNode *t)

    {

       if( t!=NULL)

        {

           PrintInOrder(t->left);

           cout<<t->key<<" ";

           PrintInOrder(t->right);

        }

    }

    

};





int main()

{

    BinarySearchTree<int> T1;

    

   for( int i=0; i<20; ++i)

        T1.insert(rand()%101);

    

    BinarySearchTree<int> T;

    

    T.insert(100);

    T.printInOrder();

    

    T=T1;

    

    

    T.print();

    

    T.printInOrder();

    

   int x;

   while( cin>>x)

    {

       cout<<T.contains(x)<<endl;

        T.remove(x);

        T.print();

        T.printInOrder();

    }

    


    

    

    return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值