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

C语言中如何深度复制包含其他结构的二叉树?

解决二叉树深度复制中value同步修改的问题

嘿,问题一眼就能看出来——你在复制value_t对象的时候只做了浅拷贝,这就导致原树和复制后的树共享了同一块value内存区域,所以修改其中一个的value,另一个必然跟着变。

问题出在哪?

看你这段处理value的代码:

value_t *newValue = malloc(sizeof(value_t)); 
newValue = node->value; 
newSymbol->value = newValue; 

你确实用malloc给newValue分配了内存,但紧接着就把newValue直接指向了原节点的value指针!这不仅浪费了刚分配的内存(还会造成内存泄漏),更关键的是新节点和原节点的value指向的是同一块内存,自然会同步变化。

怎么实现真正的深度复制?

你需要把原value_t的每一个成员都复制到新分配的内存里,而不是只复制指针。假设你的value_t结构体是类似这样的(如果结构不同,你可以对应调整):

typedef struct value {
    int int_val;
    char *str_val;
    // 其他可能的成员
} value_t;

那修正后的cloneTable函数应该这样写:

symbol_t* cloneTable(symbol_t *node) { 
    if (node == NULL) return node; 

    // 复制symbol_t节点本身
    symbol_t *newSymbol = malloc(sizeof(symbol_t)); 
    newSymbol->type = node->type; 
    // 注意:如果key是字符串类型(char*),这里也要做深拷贝,否则同样会有同步问题
    newSymbol->key = node->key; 

    // 深度复制value_t
    if (node->value != NULL) { 
        value_t *newValue = malloc(sizeof(value_t)); 
        // 复制value的基础类型成员
        newValue->int_val = node->value->int_val;
        // 如果是字符串指针,要单独分配内存复制内容,不能直接赋值指针
        if (node->value->str_val != NULL) {
            newValue->str_val = malloc(strlen(node->value->str_val) + 1);
            strcpy(newValue->str_val, node->value->str_val);
        } else {
            newValue->str_val = NULL;
        }
        // 其他成员同理,逐个复制,遇到指针就继续深拷贝
        newSymbol->value = newValue; 
    } else {
        newSymbol->value = NULL;
    }

    // 递归复制左右子树
    newSymbol->leftChild = cloneTable(node->leftChild); 
    newSymbol->rightChild = cloneTable(node->rightChild); 

    return newSymbol; 
}

额外注意点

  • 如果symbol_t里的key是字符串类型(char*),你现在的newSymbol->key = node->key;也是浅拷贝,同样会出现和value一样的问题,记得也要对key做深拷贝。
  • 如果value_t里还有其他指针类型的成员(比如嵌套的结构体指针),你需要继续对这些成员做深度复制,确保所有层级的内存都是独立的。
  • 别忘了后续要写对应的销毁函数,释放所有分配的内存,避免内存泄漏。

内容的提问来源于stack exchange,提问作者stitch123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:27:17