第一个例程是没有考虑point是parent的右子树,而parent的左子树非空的情况
第二个例程用point的左子树的右子树中最右边的一个子孙来替代被删除的point,如果(*parent).left==child条件满足,则说明point只有一个作为树叶存在的左儿子,所以要特殊处理
第二个例程用point的左子树的右子树中最右边的一个子孙来替代被删除的point,如果(*parent).left==child条件满足,则说明point只有一个作为树叶存在的左儿子,所以要特殊处理
解决方案 »
- 如何禁用CComboBox中的指定选项?
- 界面上几个static按件,如何实现tab到哪个哪个变色
- activex做cab让浏览器加载,签名是不是要花钱才行?
- 麻将牌的图像分割问题
- 关于成员函数
- 关于解压PNG中的IDAT Chunk的问题
- 如何在DirectShow的filter的接口中增加函数
- 关于接口名称与接口方法的关系??
- link错误!!!我该怎么办????
- how to customize window's border(width & style)?????
- 关于在ocx中调用对话框的问题,郁闷很久了,帮忙看看,谢谢了......马上解决立刻给分.............................
- 有谁在windows mobile 6.0平台下开发过DirectDraw程序
第二个例程我看明白了,是删除有序二叉树的当前结点,那么必须找到有序序列的前一个结点来代替当前结点.
现在将困扰你的部分解释一下:(*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; //和算法没关系