最近在进行前序插入构造二叉树时被 * 和 *& 绊了一下。先贴错误代码:
#include<cstdlib>
#include<iostream>
using namespace std;
typedef char Elemtype;
typedef enum {link, thread} PointerTag;
typedef struct Node{
Elemtype data;
PointerTag ltag;
PointerTag rtag;
struct Node *lchild=nullptr;
struct Node *rchild=nullptr;
}BinaryTreeNode, *BinaryTreeNodePtr;
//前序插入构造二叉树
// "#" means NULL;
void CreateBinaryTree_PreOrder(BinaryTreeNode *T){
Elemtype temp;
cin>>temp;
if(temp == '#'){
T = nullptr;
return ;
}else{
T = (BinaryTreeNodePtr)malloc(sizeof(BinaryTreeNode));
T->data = temp;
}
CreateBinaryTree_PreOrder(T->lchild);
CreateBinaryTree_PreOrder(T->rchild);
}
int main(){
BinaryTreeNode *T = (BinaryTreeNodePtr)malloc(sizeof(BinaryTreeNode));
CreateBinaryTree_PreOrder(T);
cout<<endl;
return 0;
}
第十八行的形参是 * T,为指向T的一个指针,main函数中调用时,将指针T传入,malloc() 函数申请的内存会在该函数结束时全部释放。这相当于没有二叉树没有进行构造。这是因为形参是一个传值引用,* T会对传入参数进行复制。因此,该函数运行结束后,只能改变传入指针指向的值,并不能改变该指针的指向。
若将形参变为BinaryTreeNode *&T
,即指针的引用,就可以改变传入指针的指向或是指针指向的值。具体代码如下:
void CreateBinaryTree_PreOrder(BinaryTreeNode *&T){
Elemtype temp;
cin>>temp;
if(temp == '#'){
T = nullptr;
return ;
}else{
T = (BinaryTreeNodePtr)malloc(sizeof(BinaryTreeNode));
T->data = temp;
}
CreateBinaryTree_PreOrder(T->lchild);
CreateBinaryTree_PreOrder(T->rchild);
}