搜索二叉树的递归算法

#include<iostream>
using namespace std;
    typedef struct student
        {
            int data;
            student *left;
            student *right;
        }*Btree,btree;

    void init_tree(Btree &L);
    void insert_data(Btree &L,int e) ; //插入节点
    void mid_print(Btree L);
    Btree search_data(Btree L,int e) ; //递归查找节点
    Btree right_child_min(Btree L);
    void delete_data(Btree &L,int e);//删除值为e的节点
    int main()
        {
            Btree L;
            init_tree(L);
            int a[7]={2,1,3,7,6,4,5};
            for(int i=0;i<=6;i++)
            {
                insert_data(L,a[i]);
            }
            mid_print(L);
            cout<<"请输入你想查找的节点的值"<<endl;
            int n;
            cin>>n;
            Btree temp=search_data(L,n);
            if(temp==NULL)
            {
                cout<<"没有找到这个值"<<endl;
            }

            else
            {
                cout<<"查找的这个值是"<<temp->data<<endl;

            }
            cout<<"你想删除的值是"<<endl;
            cin>>n;
            delete_data(L,n);
            mid_print(L);
            return 0;
        }

    void init_tree(Btree &L)
        {
            L=new btree;
            L=NULL;
        }

    void insert_data(Btree &L,int e)  //插入节点
        {
            if(L==NULL)
            {
                Btree s=new btree;
                s->left=NULL;
                s->right=NULL;
                s->data=e;
                L=s;
                return ;
            }
        else if(L->data==e)  //插入的值和节点值相同,这是不允许发生的
            {
                return ;
            }
        else if(L->data<e)
            {
                insert_data(L->right,e);  //递归处理右子树 这里的L-right 是将L里面的一个元素传进去,并不是单纯的NULL
                return ;
            }
        else
            {
                insert_data(L->left,e);  //递归处理左子树
                return ;
            }

        }

    void mid_print(Btree L)  //中序遍历
        {
            if(L!=NULL)
            {
                mid_print(L->left);
                cout<<L->data<<" ";
                mid_print(L->right);

            }
        }


    Btree search_data(Btree L,int e)  //递归查找节点
        {
            if(L==NULL)
            {
                return NULL;
            }

           else if(L->data==e)
           {
               return L;
           }

           else if(L->data>e)
           {
               return  search_data(L->left,e);  //递归处理左子树
           }

           else
           {
               return search_data(L->right,e);  //递归处理右子树
           }
        }

       Btree right_child_min(Btree L)  //得到右边最小节点的指针
            {
                if(L==NULL)
                {
                    return NULL;

                }


               else if(L->right!=NULL)
               {
                   Btree p=L->right;
                   while(p->left!=NULL)
                   {
                       p=p->left;
                   }

                    return p;
               }



            }



    void delete_data(Btree &L,int e)  //删除递归
        {
            if(L==NULL)
            {
                return ;
            }
            else if(L->data<e)
            {
                delete_data(L->right,e);
            }

            else if(L->data>e)
            {
                delete_data(L->left,e);
            }

            else if(L->data==e)
            {
                if(L->left!=NULL&&L->right!=NULL)

                    {
                        Btree temp=right_child_min(L);
                        L->data=temp->data; //右子树的最小值赋给他
                        delete_data(L->right,temp->data);  //删除右子树的最小值

                    }

                else if(L->right==NULL&&L->left==NULL)
                    {
                        delete L;
                        L=NULL;

                    }
                else if(L->right==NULL)
                    {
                        Btree temp=L;
                        L=L->left;
                        delete temp;

                    }

                else
                    {
                       Btree temp=L;
                       L=L->right;
                       delete temp;
                    }
            }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值