/* BinarySearchTree.c -- 二叉搜索树实现文件 */
#include
#include
#include "BinarySearchTree.h"
/* 局部函数声明 */
int Left_Is_Less_Than_Right (const Item left, const Item right) ;
int Left_Is_More_Than_Right (const Item left, const Item right) ;
Position Make_Node (const Item item) ;
void Copy_Item_To_Node (Node * * pnode, const Item * pitem) ;
/* 接口函数声明 */
void InitializeTree (Tree * ptree)
{
*ptree = NULL ;
}
int TreeIsEmpty (const Tree tree)
{
return NULL == tree ;
}
Position Find (const Tree tree, const Item item)
{
if (TreeIsEmpty (tree))
return NULL ;
if (Left_Is_Less_Than_Right (item, tree -> item))
return Find (tree -> left, item) ;
else if (Left_Is_More_Than_Right (item, tree -> item))
return Find (tree -> right, item) ;
else
return tree ;
}
Position FindMin (const Tree tree)
{
if (TreeIsEmpty (tree))
return NULL ;
else if (NULL == tree -> left)
return tree ;
else
return FindMin (tree -> left) ;
}
Position FindMax (const Tree tree)
{
if (TreeIsEmpty (tree))
return NULL ;
else if (NULL == tree -> right)
return tree ;
else
return FindMax (tree -> right) ;
}
Tree Insert (Tree tree, const Item item)
{
if (NULL == tree)
{
tree = Make_Node (item) ;
if (NULL == tree)
return NULL ;
}
else if (Left_Is_Less_Than_Right (item, tree -> item))
tree -> left = Insert (tree -> left, item) ;
else if (Left_Is_More_Than_Right (item, tree -> item))
tree -> right = Insert (tree -> right, item) ;
/* Else item is in the tree already; We'll do nothing */
return tree ;
}
Tree Delete (Tree tree, const Item item)
{
Position temp ;
if (NULL == tree)
return NULL ;
else if (Left_Is_Less_Than_Right (item, tree -> item))
tree -> left = Delete (tree -> left, item) ;
else if (Left_Is_More_Than_Right (item, tree -> item))
tree -> right = Delete (tree -> right, item) ;
/* Found element to be deleted */
else if (tree -> left && tree -> right)
{
temp = FindMin (tree) ;
Copy_Item_To_Node (&tree, &temp -> item) ;
tree -> right = Delete (tree -> right, tree -> item) ;
}
/* one or zero children
else
{
temp = tree ;
if (NULL == tree -> left)
tree = tree -> right ;
else if (NULL == tree -> right)
tree = tree -> left ;
free (temp) ;
}
return tree ;
}
void InorderTraversal (const Tree tree, void (* pfun) (const Item item))
{
if (tree != NULL)
{
InorderTraversal (tree -> left, pfun) ;
(* pfun) (tree -> item) ;
InorderTraversal (tree -> right, pfun) ;
}
}
void EmptyTheTree (Tree tree)
{
if (tree != NULL)
{
EmptyTheTree (tree -> left) ;
EmptyTheTree (tree -> right) ;
free (tree) ;
}
}
/* 局部函数定义 */
int Left_Is_Less_Than_Right (const Item left, const Item right)
{
return left < right ;
}
int Left_Is_More_Than_Right (const Item left, const Item right)
{
return left > right ;
}
Position Make_Node (const Item item)
{
Node * new_node ;
new_node = (Node *) malloc (sizeof (Node)) ;
if (NULL == new_node)
return NULL ;
else
{
Copy_Item_To_Node (&new_node, &item) ;
new_node -> left = NULL ;
new_node -> right = NULL ;
return new_node ;
}
}
void Copy_Item_To_Node (Node * * pnode, const Item * pitem)
{
(*pnode) -> item = *pitem ;
}