二叉的实现(C++)

来源:百度知道 编辑:UC知道 时间:2024/06/07 20:42:04
大家看看这几个函数...
void CreateBinTree (istream& in,
BinTreeNode<T> *& subTree);
//从文件读入建树
bool Insert (BinTreeNode<T> *& subTree, T& x); //插入
void destroy (BinTreeNode<T> *& subTree); //删除
bool Find (BinTreeNode<T> *subTree, T& x);
//查找
template<class T>
void BinaryTree<T>::
destroy (BinTreeNode<T> * subTree) {
//私有函数: 删除根为subTree的子树
if (subTree != NULL) {
destroy (subTree->leftChild); //删除左子树
destroy (subTree->rightChild); //删除右子树
delete subTree; //删除根结点
}
};
怎么它有的时候是传指针...有的时候就是传"&*"....?是打印错误还是?

当然没有错,补充一下:
(1)参数传指针,那么函数体内可以对指针所指内存进行存取;
(2)参数传指针的引用,即参数类型写为:TYPE *&时(TYPE为泛指一切数据类型),那么这个TYPE类型的指针引用参数,在函数体内,不但可以对指针初始所指内存进行存取,还可以把指针所指的内存地址进行改变,且这种改变就是改变了实参本身,举个列子:
// 假如Insert函数体内有如下代码(我为了举例填加的,实际实现绝不是这样的,呵呵)
bool Insert (BinTreeNode<T> *& subTree, T& x)
{
// 存取subTree所指内存
//...
subTree = (BinTreeNode<T>*)0x00000000; //把subTree的地址改为0x00000000
return true;
}
// 调用示例
BinTreeNode<T> someNode; // 假定someNode的内存地址为0x00400000
T x;
if(Insert(&someNode, x)){
// Insert函数操作成功,此时实参someNode的内存地址已经是0x00000000了
// 这个就是传引用的威力
}
else{}

至于Insert函数为什么要这么设计,你要理论分析在二叉树的某个节点处插入操作的物理意义(这个已经超出了你提的问题范围了)

不是打印错误。*&表示指针的引用类型,这样函数调用的过程中,实参的变化与形参一致。