这是一个困扰了我许久的问题, 虽然网上有很多完全前序序列建立二叉树的例子, 但我很想把我自己的代码改对, 而不是绕过去看正确答案.
typedef int ElemType;
结构体定义:
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
我写的错误的函数:
void CreateBTbyPreOrder(BiTree BT){
int a;
scanf("%d",&a);
if(a==-1) {
BT=NULL;
}
else{
BT = (BiTNode*)malloc(sizeof(BiTNode));
BT->data = a;
CreateBTbyPreOrder(BT->lchild);
CreateBTbyPreOrder(BT->rchild);
}
return;
}
main调用错误函数方法:
int main(){
BiTree BT2;
CreateBTbyPreOrder(BT2);
PreOrder(BT2);printf("n");
return 0;
}
输入:
1 4 2 -1 -1 5 -1 -1 3 -1 6 -1 -1
现象:
运行时错误, 程序崩掉, 无法继续运行.
网上找到了一个可以正确运行的写法:
BiTree CreateBT(){
int a;
BiTree BT;
scanf("%d", &a);
if(a==-1) {
BT=NULL;
}
else{
BT=(BiTree)malloc(sizeof(BiTNode));
BT->data = a;
BT->lchild = CreateBT();
BT->rchild = CreateBT();
}
return BT;
}
调用方法:
int main(){
BiTree BT3 = CreateBT();
PreOrder(BT3);printf("n");
}
输入:
1 4 2 -1 -1 5 -1 -1 3 -1 6 -1 -1
现象:
142536
我和网上的写法有什么区别吗? 我认为无非是一个传一个指针进去, 一个是返回来一个指针. 为什么我的就是不对呢?
完整代码:
1 个回答
区别是CreateBTbyPreOrder的错误是没有把分配的指针(BT)返回给调用者,CreateBT会把BT通过返回值返回给调用者。
你如果要传递指针,应该把指针的指针传过去:
void CreateBTbyPreOrder(BiTree * BT){
int a;
scanf("%d",&a);
if(a==-1) {
*BT=NULL;
}
else{
*BT = (BiTNode*)malloc(sizeof(BiTNode));
*BT->data = a;
CreateBTbyPreOrder(*BT->lchild);
CreateBTbyPreOrder(*BT->rchild);
}
return;
}
int main(){
BiTree BT2;
CreateBTbyPreOrder(&BT2);
PreOrder(BT2);printf("n");
return 0;
}
撰写答案