数据结构之二叉排序树

以下内容是以C++作为编程语言以二叉链表作为存储结构的二叉排序树生成、中序遍历和节点的删除。


#include<iostream>
#include<conio.h>
using namespace std;
bool rut=false;
class jie{
public:
    int data;
    jie *left;
    jie *right;
};
void insert1(jie **root,jie *s)//插入
{
    if(*root==NULL){ *root=s;}
    
    else if((*root)->data>s->data)insert1(&(*root)->left,s);
    else insert1(&(*root)->right,s);
}

(二叉排序树的生成是一边比较一边进行插入的)
 void create(jie **root,int n,int a[])//以数组A构造二叉树(root为根)
{
    jie *s;
    for(int i=1;i<=10;i++)
    {
        s=new jie;
        s->data=a[i];
        s->left=NULL;s->right=NULL;
        insert1(&(*root),s);
        //*root=s;
    }
    //cout<<"check successfully\n";
}
void check(jie *root,int key)//检查某节点是否存在在以root为根的树里
{
    
    if(root->data==key)rut=true;
    else if(root==NULL) rut=false;
    else if(root->data>key&&root->left!=NULL)check(root->left,key);
    else if(root->data<key&&root->right!=NULL)check(root->right,key);
}
void ergotic(jie *root)//中序遍历
{
     jie *p=root;
     if (p!=NULL)
     {
         ergotic(p->left);
         cout<<p->data<<"\t";
         ergotic(p->right);
     }
}
jie *fin(jie *root)//找以root为根的最左的不为空的节点的父节点
{
    jie *q=root;
    jie *p=q;
    while(q->left!=NULL){p=q;q=q->left;}
    return p;
}
void del(jie *root,int key)//删除节点
{
     jie *q=root;jie *f=q;
     while(q->data!=key&& q!=NULL)
     {
         if(q->data>key){f=q;q=q->left;}
         else{f=q; q=q->right;}

     }
     if(q!=NULL&&f->left==q)//q是其父节点f的左孩子时
     {
         jie *find,*p=NULL;
         if(q->left==NULL&&q->right==NULL)f->left=NULL;
         else if(q->left!=NULL&&q->right==NULL){f->left=q->left;}
         else if(q->right->left!=NULL)
         {find=fin(q->right);p=find->left;find->left=NULL;p->left=q->left;p->right=q->right;f->left=p;}
         else if(q->right->left==NULL){q->right->left=q->left;f->left=q->right;}
     }
     else if(q!=NULL&&f->right==q)//q是其父节点f的右孩子时
     {
        jie *find,*p=NULL;
        if(q->left==NULL&&q->right==NULL)f->right=NULL;
         else if(q->left!=NULL&&q->right==NULL){f->right=q->left;}
         else if(q->right->left!=NULL)
         {find=fin(q->right);p=find->left;find->left=NULL;p->left=q->left;p->right=q->right;f->right=p;}
         else if(q->right->left==NULL){q->right->left=q->left;f->right=q->right;}
     }    
}
int main()                                                       
{
    int a[11]={};//a[0]忽略不用
    printf("请输入11个整数:\n");
    for(int i=1;i<=10;i++)
    {
        scanf("%d",&a[i]);
    }
     system( "cls ") ;
    cout<<"在插入二叉排序树之前的序列顺序:\n";
    for(int i=1;i<=10;i++)
    cout<<a[i]<<"\t";
    cout<<"\n";
    jie *root=NULL;//定义二叉树的根
    
   create(&root,10,a);//以数组a,以root为根构造二叉排序树
    cout<<"二叉排序树构造成功!\n";
    if(root==NULL)cout<<"空树\n";//p=root;
    cout<<"中序遍历此二叉排序树,结果为:\n";
    ergotic(root);cout<<"\n";//中序遍历
    cout<<"请输入要删除的关键字:\n";
    int sun;cin>>sun;
    check(root,sun);
    if(rut==false)cout<<"你输入的关键字不在树里\n";
    else {del(root,sun);cout<<"删除以后中序遍历得到的结果为:\n";ergotic(root);}
    cout<<"\n";
    return 0;
}







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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值