You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何第一种BinTree创建函数失效?char*与char**传参差异解惑

二叉树创建函数的参数差异解析

我希望创建如图所示的二叉树:
目标二叉树结构

以下是无法正常生成目标二叉树的实现代码:

typedef struct BinNode {
    Elemtype data;
    struct BinNode* left;
    struct BinNode* right;
}BinNode,*BinTree;
void createBinTree(BinTree* root, char* a) {
    if (*a == '\0')
        return;
    if (*a == '#') {
        (*root) = NULL;
        return;
    }
    else {
        (*root) = (BinTree)malloc(sizeof(BinNode));
        assert((*root) != NULL);
        (*root)->data = *a;
        createBinTree(&(*root)->left, ++a);
        createBinTree(&(*root)->right, ++a);
        return;
    }

}
int main() {
    char* ptr = "ABC##DE##F##G#H##";
    BinTree my_tree = NULL;
    createBinTree(&my_tree,ptr);
    return 0;
}

而以下实现可以正常生成目标二叉树:

void createBinTree(BinTree* root, char** a) {
    if (**a == '\0')
        return;
    if (**a == '#') {
        (*root) = NULL;
        (*a)++;
        return;
    }
    else {
        (*root) = (BinTree)malloc(sizeof(BinNode));
        assert((*root) != NULL);
        (*root)->data = **a;
        (*a)++;
        createBinTree(&(*root)->left, a);
        createBinTree(&(*root)->right, a);
        return;
    }
}
int main() {
    char* ptr = "ABC##DE##F##G#H##";
    BinTree my_tree = NULL;
    createBinTree(&my_tree,&ptr);
    return 0;
}

我不理解为何调用createBinTree需要传递&ptr而非直接传ptr,恳请解答!


问题解析

核心原因是C语言的参数传递是值传递,我们需要在递归过程中持续推进字符串的遍历指针,让所有递归调用共享同一个指针的状态:

  • 第一个版本的问题:
    函数参数是char* a,调用时传入的ptr会被复制一份作为函数内的局部变量a。当执行++a时,只是修改了这个局部副本的指向,不会影响主函数里的ptr。递归创建左子树后,回到当前层创建右子树时,a还是原来的位置,导致字符串的遍历顺序完全错误,无法构建正确的二叉树。
  • 第二个版本的解决思路:
    函数参数改为char** a,传入的是&ptr——也就是指针的指针。此时函数内的(*a)直接对应主函数里的ptr,执行(*a)++时,修改的是ptr本身的指向。所有递归调用都会共享这个指针的状态,每处理一个字符就推进一次指针,保证整个字符串按顺序被遍历,从而正确构建出目标二叉树。

内容的提问来源于stack exchange,提问作者Ly丶Cooki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 09:43:33