#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指向下一个完成的二叉树,所以应该返回一个已经删除完成的二叉树,并用now指向它
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;//因为now后面跟着的指针指向now,now指向right以后相应的后面的指针也指向了right(np!)
free(temp);
return now;//因为前面的now要有个指向 就指向成功删除的二叉树吧,也就是指向成功删除的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;//因为now后面跟着的指针指向now,now指向right以后相应的后面的指针也指向了right(np!)
free(temp);
return now;//现在的now指向的二叉树是已经完成的,返回值给前面
}
//右节点不空
else
{
STree* temp = now;
now = now->right;//因为now后面跟着的指针指向now,now指向right以后相应的后面的指针也指向了right(np!)
free(temp);
return now;
}
}
}
二叉搜索树的插入和删除(附带随机数测试)(C语言实现)
最新推荐文章于 2023-06-03 18:05:20 发布