二叉树的创建
typedef struct node
{
char data;
struct node *lchild, *rchild;
}Node,*pNode;
创建形式一:
int buildTree(pNode &T)
{
char data;
cin >> data;
if (data == '#')
T = NULL;
else{
T = (pNode)malloc(sizeof(Node));
//生成根节点
T->data = data;
//生成左子树
buildTree(T->lchild);
//生成右子树
buildTree(T->rchild);
}
return 0;
}
创建形式二:
void CreatBiTree( pNode * T)
{
char ch;
ch=getchar();
if( ch == '*') //如果输入星号则二叉树的节点为空节点
*T=NULL;
else
{
if ( ! ( *T=(BiTree)malloc( sizeof(struct BiTNode) ) ) )
{
printf("内存分配失败!");
return ; //如果输入的不是星号。则为新节点分配内存空间
}
else
{
(*T)->data=ch;
CreatBiTree(&((*T)->lchild)); //分配成功则接着建立左子树和右子树
CreatBiTree(&((*T)->rchild));
}
}
}
创建二叉树的时候传递的是二级指针,为何要传递二级指针呢?指针传值不是同时改变形参和实参吗?
问题是,在建立二叉树的过程中,不是改变了形参的值,而是: 改变了形参的指向;而退出该函数后,形参被释放了,那么为形参动态分配的空间,也就没办法释放了,造成了内存泄露问题。
看下面转自hfm_honey学习乐园的例子
void get_Vale1(char *pt)
{
pt=(char *)malloc(strlen("sx_liang")+1);
strcpy(pt,"sx_liang");
}
void get_Vale2(char **pt)
{
*pt=(char *)malloc(strlen("sx_liang")+1);
strcpy(*pt,"sx_liang");
}
int main()
{
char *pt=NULL;
get_Vale1(pt); //看看,这里调用的过程中,传递的是一级指针;
if( NULL==pt) //额。。。。在这里呢,就会执行if 里边的信息了。。。
{
cout<<"pt is NULL"<<endl;
exit(1);
}
else
cout<<pt<<endl;
get_Vale2(&pt); //这里呢,传递的是二级指针,结果呢,就输出了“sx_liang";
if( NULL==pt)
{
cout<<"pt is NULL
}
}
什么原因呢: 咱开始分析一下:
void get_Vale1(char *M)//这里呢,传递了一个指针,此时,M和 实参 pt 的指向内存的同一块空间,都指向了null;
M=(char *)malloc(strlen("sx_liang")+1); //此时呢,给M的重新开辟了一块空间, 而实参pt 没有变化,还指向NULL;
//就是这里,M 和pt 已经没有联系了,彻底变成了两个指向不同的指针;
strcpy(M,"sx_liang");//退出函数时,因为M是局部变量,在栈中分配的空间,那么M自动销毁,而在堆中为M分配的空间呢,泄露了,没有被释放;是个问题!
void get_Vale2(char **M)//这里呢,传递的是二级指针;此时,M 指向实参,而不是和实参一样指向null;*M 此时才和pt相同,都指向了NULL;注意体会一下;
*M=(char *)malloc(strlen("sx_liang")+1);//在这里呢,*M就是 实参pt ,给*M申请空间,就是在为pt 申请空间;注意体会了;
strcpy(*M,"sx_liang");//推出函数后,M销毁,但是它申请的空间没被释放,但是该空间有pt 指向它,不担心释放问题