二叉搜索树(BST)的常用操作:建树、插入、查询、删除、排序打印

来源:互联网 发布:网络视频推广方案 编辑:程序博客网 时间:2024/06/06 15:00

/*Author:IbsenData:2015.12.21*///二叉搜索树:建树,插入,删除,排序输出.#include <iostream>#include <cstdlib>using namespace std;const int M=1000; //数据大小int A[M]={5,2,1,6,7,4,8,3,9},n=9;typedef struct node{    int key; //关键字    struct node *lc,*rc;}BST;int Insret_BST(BST * &p,int k){//在树p中插入关键字k    if(p==NULL)    {        p=new BST();        p->key=k;        p->lc=p->rc=NULL;        return 1;    }    else if(p->key==k) return 0;    else if(p->key>k) return Insret_BST(p->lc,k);    else return Insret_BST(p->rc,k);}BST * Create_BST(int A[],int n){//建树    BST *bt=NULL;    for(int i=0;i<n;i++)      Insret_BST(bt,A[i]);    return bt;}BST * Search_BST(BST *bt,int k){//查找关键字k并返回其指针    if(bt==NULL||bt->key==k) return bt;    if(bt->key>k) return Search_BST(bt->lc,k);    else return Search_BST(bt->rc,k);}void In_Order_BST(BST *bt){//中序遍历二叉树:打印排序后结果    if(bt!=NULL)    {        In_Order_BST(bt->lc);        cout<<bt->key<<" ";        In_Order_BST(bt->rc);    }}void Delete_BST_Key1(BST *p,BST *&r){//当被删除的节点既有左孩子又有有孩子的情况    BST *tmp;    if(r->rc!=NULL) Delete_BST_Key1(p,r->rc);//p的左子树中的最大关键字    else    {        p->key=r->key;        tmp=r; //到这里,删除节点p就等于删除最右下的节点r        r=r->lc;        free(tmp);    }}void Delete_BST_Key(BST * &p){//删除关键字为k的节点p    BST *tmp;    if(p->rc==NULL)    {//p的右儿子为空,直接将其左儿子放在被删除的节点的位置        tmp=p;        p=p->lc;        free(tmp);    }    else if(p->lc==NULL)    {//p的左儿子为空,直接将其右儿子放在被删除的节点的位置        tmp=p;        p=p->rc;        free(tmp);    }    else Delete_BST_Key1(p,p->lc);    //p既有左孩子又有右孩子的情况,可以用左子树的最大关键字来代替p,也可以用右子树的最小关键字来代替p}int Delete_BST(BST * &bt,int k){//删除关键字k    if(bt==NULL) return 0;    else    {        if(bt->key>k) return Delete_BST(bt->lc,k);        else if(bt->key<k) return Delete_BST(bt->rc,k);        else        {            Delete_BST_Key(bt); //找到要删除的节点并删除            return 1;        }    }}int main(){    BST *bt=NULL;    bt=Create_BST(A,n);    cout<<"The Init Order :";    for(int i=0;i<n;i++)        cout<<A[i]<<" ";    cout<<endl;    cout<<"The Ascending Order of BSTree: ";    In_Order_BST(bt); cout<<endl;    cout<<"Search keys in BSTree:"<<endl;    int k;    while(cin>>k&&k)    {        if(Search_BST(bt,k)==NULL) cout<<"Search Fail!"<<endl;        else cout<<"Search Succeed!"<<endl;    }    cout<<"Insert keys in BSTree:"<<endl;    while(cin>>k&&k)    {        if(Insret_BST(bt,k))        {            cout<<"Insert Succeed!"<<endl<<"The New Order:";            In_Order_BST(bt); cout<<endl;        }        else cout<<"Insert Fail(keys exit)!"<<endl;    }    cout<<"Delete keys from BSTree:"<<endl;    while(cin>>k)    {        if(Delete_BST(bt,k))        {            cout<<"Delete Succeed!"<<endl<<"The New Order:";            In_Order_BST(bt); cout<<endl;        }        else cout<<"Delete Fail(No keys found)!"<<endl;    }    return 0;}


1 0