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 ; }