登录
登录 注册新账号
注册
已有账号登录

这是一个困扰了我许久的问题, 虽然网上有很多完全前序序列建立二叉树的例子, 但我很想把我自己的代码改对, 而不是绕过去看正确答案.

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;
}
撰写答案