#include<stdio.h>
#include<stdlib.h>
#include<time.h>
struct Data
{
int id;
};
struct STree
{
Data data;
STree* left;
STree* right;
}*head= NULL;
void travel(STree* now, Data data);
void insert(STree** head, Data data);
STree* find_min(STree* now);
STree* find_max(STree* now);
STree* Delete(STree* now, Data data);
void travel_and_print(STree* now);
int main()
{
srand(time(0));
for (int i = 0; i <= 20; i++)
{
Data temp;
temp.id = rand()%100;
insert(&head, temp);
}
printf("先序遍历的结果为:\n");
travel_and_print(head);
printf("\n");
printf("请输入要删除的节点:\n");
int d; scanf("%d", &d);
Data temp;
temp.id = d;
Delete(head, temp);
printf("先序遍历的结果为:\n");
travel_and_print(head);
printf("\n");
}
STree* insert_node_left=NULL;
STree* insert_node_right=NULL;
void travel_and_print(STree* now)
{
if (!now)
{
return;
}
else
{
printf("%d ", now->data.id);
travel_and_print(now->left);
travel_and_print(now->right);
}
}
void travel(STree* now, Data data)
{
if (!now)
{
return;
}
else
{
if (now->data.id < data.id)
{
if (now->right == NULL)
{
insert_node_right = now;
}
else
{
travel(now->right, data);
}
}
else
{
if (now->left== NULL)
{
insert_node_left = now;
}
else
{
travel(now->left, data);
}
}
}
}
void insert(STree** head,Data data)
{
STree* temp = (STree*)malloc(sizeof(STree));
temp->data = data;
temp->left = NULL;
temp->right = NULL;
if (*head)
{
insert_node_left = NULL;
insert_node_right = NULL;
travel(*head, temp->data);
if (insert_node_left)
{
insert_node_left->left = temp;
}
else
{
insert_node_right->right = temp;
}
}
else
{
*head = temp;
}
}
STree* find_min(STree* now)
{
for (; now->left; now = now->left);
return now;
}
STree* find_max(STree* now)
{
for (; now->right; now = now->right);
return now;
}
STree* Delete(STree* now, Data data)
{
if (!now)
{
return NULL;
}
else if (now->data.id > data.id)
{
now->left = Delete(now->left, data);
return now;
}
else if(now->data.id<data.id)
{
now->right = Delete(now->right, data);
return now;
}
else
{
if (now->left == NULL && now->right == NULL)
{
STree* temp = now;
now = now->right;
free(temp);
return now;
}
else if (now->left && now->right)
{
STree* temp = find_max(now->left);
now->data = temp->data;
now->left = Delete(now->left, temp->data);
return now;
}
else if (now->left && !(now->right))
{
STree* temp = now;
now = now->left;
free(temp);
return now;
}
else
{
STree* temp = now;
now = now->right;
free(temp);
return now;
}
}
}