搜索二叉树的递归算法

#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
    评论
二叉树是一种常见的数据结构,在递归算法中也有很多应用。创建二叉树递归算法可以分为前序遍历和中序遍历两种方式。 前序遍历方式下,我们按照“根-左-右”的顺序来构建二叉树。具体步骤如下: 1. 如果输入的节点值为null,则返回空节点。 2. 创建一个新的节点,将其值设置为当前的节点值。 3. 递归调用函数,将左子的根节点设置为当前节点的左子节点。 4. 递归调用函数,将右子的根节点设置为当前节点的右子节点。 5. 返回当前节点。 中序遍历方式下,我们按照“左-根-右”的顺序来构建二叉树。具体步骤如下: 1. 如果输入的节点值为null,则返回空节点。 2. 递归调用函数,将左子的根节点设置为当前节点的左子节点。 3. 创建一个新的节点,将其值设置为当前的节点值。 4. 递归调用函数,将右子的根节点设置为当前节点的右子节点。 5. 返回当前节点。 下面是一个示例代码,以前序遍历方式为例: ``` class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } public class Solution { public TreeNode buildTree(int[] preorder, int[] inorder) { return build(preorder, inorder, 0, preorder.length - 1, 0, inorder.length - 1); } private TreeNode build(int[] preorder, int[] inorder, int preStart, int preEnd, int inStart, int inEnd) { if (preStart > preEnd || inStart > inEnd) { return null; } int rootVal = preorder[preStart]; int index = 0; for (int i = inStart; i <= inEnd; i++) { if (inorder[i] == rootVal) { index = i; break; } } TreeNode root = new TreeNode(rootVal); root.left = build(preorder, inorder, preStart + 1, preStart + index - inStart, inStart, index - 1); root.right = build(preorder, inorder, preStart + index - inStart + 1, preEnd, index + 1, inEnd); return root; } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值