第一个例程是没有考虑point是parent的右子树,而parent的左子树非空的情况
第二个例程用point的左子树的右子树中最右边的一个子孙来替代被删除的point,如果(*parent).left==child条件满足,则说明point只有一个作为树叶存在的左儿子,所以要特殊处理

解决方案 »

  1.   

    第一个例程你没有写完整,没法理解;
    第二个例程我看明白了,是删除有序二叉树的当前结点,那么必须找到有序序列的前一个结点来代替当前结点.
    现在将困扰你的部分解释一下:(*point).data=(*child).data;//这里已经将point结点数据,用有序序列的前一个结点(child)换掉了,接下来就是要找到child,然后free(child);......
    if((*parent).left==child)   //当需要删除的结点(parent,point)的左子树(child)没有右子树的时候.(如下例:列表表示二叉树:8,6,9,5,0,...,需要删除结点8)
    (*parent).left=(*child).left;
    else             //当需要删除的结点(point)的左子树(parent)有一个右子树(child),而且child没有右子树的时候.(如下例:列表表示二叉树:8,6,9,5,7,0,0,...0,需要删除结点8)
    (*parent).right=(*child).right;
    ......
    return root;  //和算法没关系