c语言里面前驱的英文,中序线索树插入例程(自调整前驱后缀指针)C语言

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 ;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值