这里不做解释了,可以看前面的二叉树的实现,思想大同小异,具体可以看代码去理解
#include <stdio.h>
#include <stdlib.h>
//定义二叉查找树的存储结构
typedef struct TreeNode
{
int data; //数据域
struct TreeNode *leftChild; //左孩子指针域
struct TreeNode *rightChild; //右孩子指针域
}TreeNode, *Position ,*SearchTree;
//初始化树
void Init(SearchTree *tree)
{
(*tree) = NULL;
}
//清空树
void Empty(SearchTree *tree)
{
if((*tree) != NULL)
{
Empty(&(*tree) -> leftChild);
Empty(&(*tree) -> rightChild);
free((*tree));
}
(*tree) = NULL;
}
//插入元素, 这个方法不考虑重复元素, 只提供思路
void Insert(SearchTree *tree, int data)
{
if((*tree) == NULL)
{
(*tree) = (SearchTree)malloc(sizeof(TreeNode));
(*tree) -> data = data;
(*tree) -> leftChild = (*tree) -> rightChild = NULL;
}
else if(data < (*tree) -> data)
{
SearchTree leftTree = (*tree) -> leftChild;
Insert(&leftTree, data);
(*tree) -> leftChild = leftTree;
}
else if(data > (*tree) -> data)
{
SearchTree rightTree = (*tree) -> rightChild;
Insert(&rightTree, data);
(*tree) -> rightChild = rightTree;
}
}
//通过值来寻找节点
Position Find(SearchTree tree, int data)
{
if(tree == NULL)
{
return NULL;
}
else if(data < tree -> data)
{
return Find(tree -> leftChild, data);
}
else if(data > tree -> data)
{
return Find(tree -> rightChild, data);
}
else
{
return tree;
}
}
//寻找最小的节点
Position FindMin(SearchTree tree)
{
if(tree == NULL)
{
return NULL;
}
else if(tree -> leftChild == NULL)
{
return tree;
}
else
{
return FindMin(tree -> leftChild);
}
}
//寻找最大的结点
Position FindMax(SearchTree tree)
{
if(tree == NULL)
{
return NULL;
}
else if(tree -> rightChild == NULL)
{
return tree;
}
else
{
return FindMax(tree -> rightChild);
}
}
//删除指定结点, 根据提供的结点值
void Delete(SearchTree *tree, int data)
{
Position tmp;
if((*tree) == NULL)
{
return;
}
else if(data < (*tree) -> data)
{
Delete(&((*tree) -> leftChild), data);
}
else if(data > (*tree) -> data)
{
Delete(&((*tree) -> rightChild), data);
}
else if((*tree) -> leftChild != NULL && (*tree) -> rightChild != NULL)
{
tmp = FindMin((*tree) -> rightChild);
(*tree) -> data = tmp -> data;
SearchTree rightTree = (*tree) -> rightChild;
Delete(&rightTree, (*tree) -> data);
(*tree) -> rightChild = rightTree;
}
else
{
tmp = (*tree);
if((*tree) -> leftChild == NULL)
{
(*tree) = (*tree) -> rightChild;
}
else if((*tree) -> rightChild == NULL)
{
(*tree) = (*tree) -> leftChild;
}
free(tmp);
}
}
int main(void)
{
SearchTree tree;
Init(&tree);
Insert(&tree, 2);
Insert(&tree, 1);
Insert(&tree, 3);
Insert(&tree, 4);
// printf("%d\n", tree -> data);
// printf("%d\n", tree -> leftChild -> data);
// printf("%d\n", tree -> rightChild -> data);
// printf("%d\n", tree -> rightChild -> rightChild -> data);
//Empty(&tree);
// if(tree == NULL)
// {
// printf("%s\n", "hello");
// }
// Position p = Find(tree, 3);
// printf("%d\n", p -> rightChild -> data);
//Position p = FindMin(tree);
Delete(&tree, 4);
Position p = FindMax(tree);
printf("%d\n", p -> data);
return 0;
}