以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 计算机考研交流 』   (http://bbs.xml.org.cn/list.asp?boardid=67)
----  关于课本堆代码的一个问题?  (http://bbs.xml.org.cn/dispbbs.asp?boardid=67&rootid=&id=55200)


--  作者:hanshumin
--  发布时间:11/11/2007 11:05:00 PM

--  关于课本堆代码的一个问题?
remove函数(121页)
//删除给定下标的元素
remove(int pos, T& mode)
{
if((pos<0)||(pos>=currentsize))
   return false;
T temp = heapArray[pos];
heapArray[pos] = heapArray[--currentsize];
SiftUp(pos);
SiftDown(pos);
node = temp;
return true;
}
--  作者:hanshumin
--  发布时间:11/11/2007 11:05:00 PM

--  
我感觉应该分类讨论一下。因为待删除的结点要与最后一个结点交换。当交换后,待删除的结点所在的位置的值是最后一个结点值的大小,此时它有可能比先前删除的结点小,大或者相等。如果相等,就不用作什么工作,如果小的话,只需要SIFT UP(),如果大的话,只需要SIFT DOWN().大家认为呢?

--  作者:hanshumin
--  发布时间:11/11/2007 11:07:00 PM

--  
one  answer:
不是。其实这里的siftup和siftdown只有一个起到作用。但不知道是哪个,所以都用。如果堆的内容是1,100,80,150,300,210,85(按照完全二叉树的结构),那么删除150的时候,85替换150的位置,故需要siftup
--  作者:lionx
--  发布时间:11/12/2007 9:57:00 AM

--  
我认为你说的很对
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
42.969ms