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
相关产品推荐
相关产品推荐

