递归创建二叉树的指针传递和退出条件

一想到二叉树的创建,很自然的我们会写出这样的代码

int create_tree(binary_node** b){
    char c;
    scanf("%c",&c);
    if (c == '#'){
        *b = NULL;
    }else{
        //这里注意,如果传入进来的只是*b 那么走到这里重新分配内存空间之后就不是在操作实参了。
        *b =  (binary_node*)malloc(sizeof(binary_node));
        if (b == NULL)
            return ERROR;
        (*b)->data = c;
        create_tree(&(*b)->left);
        create_tree(&(*b)->right);
    }
};
//preorder traversal
void preorder(binary_node* b){
    if(b != NULL){
        printf("%c,",b->data);
        preorder(b->left);
        preorder(b->right);
    }
}
int main() {
    setbuf(stdin,NULL);
    //传递指针的指针(改成传递指针的引用也是可以的),
    //还有一种创建的时候直接将Node作为函数返回值返回的比我写的这种方式写起来简单一点
    binary_node* b = NULL;
    create_tree(&b);
    printf("pre order\n");
    preorder(b);
    printf("\n");
    std::cout << "Hello, World!" << std::endl;
    return 0;
}

先序创建和遍历。
这里写图片描述

想创建上面这个二叉树,我直接输入了abdc,然而发现并不退出。事实证明如果要找到退出条件#,也就是得把节点的空也输入进去

这里写图片描述

实际上我们应该输入一个这样的二叉树,把空节点也输入进去才能保证递归有退出
测试结果
这里写图片描述


版权声明:本文为qq91752728原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。