#include<iostream>
#include<string>
using namespace std;
struct node
{
int data;
node *r;
node *l;
};
void Insert(node *&root,int val)
{
if(root==NULL)
{
root=new node;
root->data=val;
root->l=NULL;
root->r=NULL;
}
else if(val>root->data)
{
Insert(root->r,val);
}
else
{
Insert(root->l,val);
}
}
node* FindMin(node *root)//递归查找
{
if(root==NULL)
return NULL;
else if(root->l==NULL)
return root;
else return FindMin(root->l);
}
node *FinMax(node *root)//非递归查找
{
if(root!=NULL)
while(root->r!=NULL)
root=root->r;
return root;
}
node *Del(node *&root,int val)//先要找到要删除的元素,然后再根据情况讨论删除。
{
node* temp;
if(val > root->data)//大于,则搜索右子树
Del(root->r,val);
else if(val < root->data)//小于,则搜索左子树
Del(root->l,val);
else if(root->l!=NULL && root->r!=NULL)//找到了,最复杂情况,删除的是一个节点有左右2个子叶。
{
temp=FindMin(root->r);//找到右子树的最小节点替换它。
root->data=temp->data;
root->r=Del(root->r,root->data);//递归下去删除那个节点。
}
else
{//找到了,简单情况,是叶子或者下面只有单子子叶。
temp=root;
if(root->l==NULL)
root=root->r;
else if(root->r==NULL)
root=root->l;
delete temp;
}
return root;
}
void dfs(node *root)
{
printf("val=%d\n",root->data);
if(root->l)
dfs(root->l);
else if(root->r)
dfs(root->r);
}
int main()
{
node *root=NULL;
Insert(root,1);
Insert(root,2);
Insert(root,0);
Insert(root,-5);
cout<<FindMin(root)->data<<endl;
cout<<FinMax(root)->data<<endl;
Del(root,-5);
cout<<FindMin(root)->data<<endl;
return 0;
}
简单的链表实现,用new delete很方便的。