2 回答

TA贡献2065条经验 获得超14个赞
不是很明白“函数出现两次”的意思,以下就实现说下看法:
template <class T> class LeftistHeap中:
(1)void destroy(LeftistNode<T>* &heap)是其私有函数,因为该类的使用者不应该持有LeftistNode<T>*指针;
(2)template <class T> void LeftistHeap<T>::destroy()是其公有函数,如果没有void destroy(LeftistNode<T>* &heap),其中的所有实现都需要在这个公有函数中出现。如果还需要删除其他节点而不只是根节点,那么这些实现代码又得再写一遍。减少重复代码,是void destroy(LeftistNode<T>* &heap)存在的意义。
(3)void destroy(LeftistNode<T>* &heap)采用递归方式实现,使得代码最简,如果不用递归,我所想到的方式是用循环。如此就会增加很多代码,因为需要确定一个节点左右孩子节点指针都为NULL时,才能删除该节点。这样就需要保存从根节点到可以删除的第一个节点之间的所有节点,然后逆向逐一删除。

TA贡献1799条经验 获得超9个赞
这个叫函数重载,可以一个函数实现,也就是不用重载,也能实现代码功能。
函数重载的目的是为了使用方便和不同的处理方式,函数重载调用时是根据实参的数据类型调用对应形参的函数。
添加回答
举报