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

