#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;
}
}
}
搜索二叉树的递归算法
最新推荐文章于 2023-04-06 19:55:58 发布