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

C语言二叉树排序单词异常:节点数据被覆盖问题求助

排查C语言二叉树节点数据被覆盖问题的建议

1. 先查addtree的根指针传递逻辑

如果你的addtree函数是这么写的:

void addtree(Node *root, char *word)

那十有八九是这里的问题——C语言是值传递,函数里修改root指针根本影响不到外部的根变量。得改成传递指针的指针:

void addtree(Node **root, char *word)

调用的时候传&root,这样函数里才能真正修改外部的根节点指向。

2. 检查字符串的存储方式

如果你的节点结构体是直接存字符串指针:

typedef struct node {
    char *word;
    struct node *left;
    struct node *right;
} Node;

而你输入时用的是同一个缓冲区(比如全局数组或者重复用同一个局部数组读输入),所有节点的word都会指向同一块内存,最后输入的Hi自然会覆盖之前的Hello。解决办法是给每个节点的字符串单独分配内存:

node->word = strdup(word); // 等价于 malloc(strlen(word)+1) + strcpy

记得最后要释放这些内存,避免泄漏。

3. 验证打印函数的遍历逻辑

确认你的中序遍历打印函数没写错,比如正确的逻辑应该是:

void printtree(Node *root) {
    if (root != NULL) {
        printtree(root->left);
        printf("%s\n", root->word);
        printtree(root->right);
    }
}

别搞反了左右顺序,或者误把同一个节点重复输出。

4. 用指针地址定位问题

添加节点和打印时,多打一行指针地址:

printf("节点word地址:%p,值:%s\n", root->word, root->word);

如果两个节点的word地址一样,那就是字符串共享内存导致的覆盖;如果地址不同但值相同,就得检查addtree里的字符串比较逻辑(比如strcmp用反了,导致新节点覆盖旧节点)。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 20:18:20