int Insert (Tree * const ptree, const Item * const pitem)
{
Node * new_node ;
Node * parent, * scan = *ptree ;
if (NULL == (new_node = Make_Node (pitem)))
return 0 ;
if (TreeIsEmpty (ptree))
{
*ptree = new_node ;
(*ptree) -> left = NULL ;
(*ptree) -> right = NULL ;
return 1 ;
}
while (scan != NULL)
{
parent = scan ;
if (Left_Is_Greater_Than_Right (*pitem, scan -> item))
{
if (THREAD == scan -> right_tag)
{
parent = scan ;
break ;
}
else
scan = scan -> right ;
}
else if (Left_Is_Lesser_Than_Right (*pitem, scan -> item))
{
if (THREAD == scan -> left_tag)
{
parent = scan ;
break ;
}
else
scan = scan -> left ;
}
/*出现重复数据*/
else
{
free (new_node) ;
return 0 ;
}
}
if (Left_Is_Greater_Than_Right (*pitem, parent -> item))
{
parent -> right_tag = LINK ;
parent -> right = new_node ;
parent -> right -> left = Find_Predecessor (ptree, parent, parent -> right) ;
parent -> right -> right = Find_Successor (ptree, parent, parent -> right) ;
}
else
{
parent -> left_tag = LINK ;
parent -> left = new_node ;
parent -> left -> left = Find_Predecessor (ptree, parent, parent -> left) ;
parent -> left -> right = Find_Successor (ptree, parent, parent -> left) ;
}
return 1 ;
}static Node * Find_Predecessor (const Tree * const ptree, Node * const parent, const Node * const pnode) ;
static Node * Find_Successor (const Tree * const ptree, Node * const parent, const Node * const pnode) ;
static Node * The_Parent_Of (const Tree * const ptree, const Node * const pnode) ; Node * FindMin (const Tree * const ptree)
{
Node * parent = NULL, * scan = *ptree ;
while (scan != NULL)
{
parent = scan ;
scan = scan -> left ;
}
return parent ;
}
Node * FindMax (const Tree * const ptree)
{
Node * parent = NULL, * scan = *ptree ;
while (scan != NULL)
{
parent = scan ;
scan = scan -> right ;
}
return parent ;
} static Node * Find_Predecessor (const Tree * const ptree, Node * const parent, const Node * const pnode)
{
Node * predecessor ;
if (pnode == parent -> left)
{
if (pnode == FindMin (ptree))
predecessor = NULL ;
else
predecessor = The_Parent_Of (ptree, parent) ;
}
else if (pnode == parent -> right)
predecessor = parent ;
return predecessor ;
}
static Node * Find_Successor (const Tree * const ptree, Node * const parent, const Node * const pnode)
{
Node * successor ;
if (pnode == parent -> left)
successor = parent ;
else if (pnode == parent -> right)
{
if (pnode == FindMax (ptree))
successor = NULL ;
else
successor = The_Parent_Of (ptree, parent) ;
}
return successor ;
}
static Node * The_Parent_Of (const Tree * const ptree, const Node * const pnode)
{
Node * parent = NULL, * scan = *ptree ;
while (scan != NULL)
{
parent = scan ;
if (Left_Is_Greater_Than_Right (pnode -> item, scan -> item))
{
if (scan -> right != NULL)
if (Left_Is_Equal_To_Right (pnode -> item, scan -> right -> item))
break ;
scan = scan -> right ;
}
else if (Left_Is_Lesser_Than_Right (pnode -> item, scan -> item))
{
if (scan -> left != NULL)
if (Left_Is_Equal_To_Right (pnode -> item, scan -> left -> item))
break ;
scan = scan -> left ;
}
else
{
if (*ptree == scan)
parent = NULL ;
break ;
}
}
return parent ;
}