//二叉搜索树的删除
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int data;
struct Node *leftChild;
struct Node *rightChild;
}Node;
void Build_tree(Node **root);
void Insert_tree(Node **root,Node *new_node);
void Traverse_tree(Node **root);
void Remove_tree(Node **root,int value);//删除结点
Node** min(Node **root);//右子树中寻找中序下的第一个结点
void Build_tree(Node **root)//建树
{
int value;
Node *new_node;
*root=NULL;
new_node=NULL;
printf("请输入数据,以负数作为结束\n");
scanf("%d",&value);
while(value>0)
{
new_node=(Node*)malloc(sizeof(Node));
new_node->data=value;
new_node->leftChild=NULL;
new_node->rightChild=NULL;
Insert_tree(root,new_node);
scanf("%d",&value);
}
printf("二叉搜索树构建完成\n");
}
void Traverse_tree(Node **root)//中序遍历
{
if(*root!=NULL)
{
Traverse_tree(&((*root)->leftChild));
printf("%d ",(*root)->data);
Traverse_tree(&((*root)->rightChild));
}
}
void Insert_tree(Node **root,Node *new_node)//向树中插入新节点
{
if(*root==NULL)
*root=new_node;
else if(((*root)->data)>new_node->data)
{
Insert_tree(&((*root)->leftChild),new_node);
}
else if(((*root)->data)<new_node->data)
{
Insert_tree(&((*root)->rightChild),new_node);
}
}
void Remove_tree(Node **root,int x)
{
Node **temp;
if(*root!=NULL)
if(x<((*root)->data)) //要删除的节点在左子树中
Remove_tree(&((*root)->leftChild),x);
else if(x>((*root)->data)) //要删除的节点在右子树中
Remove_tree(&((*root)->rightChild),x);
else if(((*root)->leftChild)!=NULL&&((*root)->rightChild)!=NULL)//要删除的就是当前节点
{//当前结点有左子树和右子树
printf("*1");
temp=min(&((*root)->rightChild));//获得右子树中的最小值
(*root)->data=(*temp)->data;
Remove_tree(&((*root)->rightChild),(*root)->data);
}
else
{//当前节点只有一个子树或没有子树
if((*root)->leftChild!=NULL)//当前节点没有左子树
*root=(*root)->leftChild;
else if((*root)->rightChild!=NULL)//当前节点没有右子树
*root=(*root)->rightChild;
else
*root=NULL;
}
else
printf("二叉搜索树是空树或要删除的数据不存在!");
}
Node** min(Node** root)
{
// printf("+");
while((*root)->leftChild!=NULL) root=&((*root)->leftChild);
return root;
}
int main(int argc,char *argv[])
{
Node **root;
int value;
Build_tree(root);
printf("\n用插入法建树的遍历结果为:\n");
Traverse_tree(root);
printf("\n请输入要删除的数:\n");
scanf("%d",&value);
Remove_tree(root,value);
printf("\n删除后的遍历结果为:\n");
Traverse_tree(root);
system("PAUSE");
return 0;
}
试了好多次应该没错。