按字母序排序的二叉搜索树插入后中序遍历重复输出相同单词排查
问题根因
你的insert函数逻辑是正确的,错误出在create_node函数和指针使用逻辑上:
- 创建节点时,你先为
temp->data申请了独立的堆内存,紧接着执行temp->data = val,直接将节点的字符串指针指向了main函数中唯一的输入缓冲区element,刚申请的堆空间被直接遗弃。 - 所有树节点的
data指针最终都指向同一块内存地址,每次scanf输入新单词都会覆盖这块内存的内容,因此中序遍历时所有节点都会输出最新输入的同一个单词。
修复方案
将create_node中的指针赋值替换为字符串拷贝,把输入的内容复制到节点独立申请的堆空间中即可,修改后的函数代码如下:
tree_node* create_node(char* val) { tree_node* temp; temp = (tree_node*)malloc(sizeof(tree_node)); temp->data = malloc(sizeof(char) * MAX); // 替换原有的指针赋值操作为字符串拷贝 strcpy(temp->data, val); temp->left = NULL; temp->right = NULL; return temp; }
额外优化建议
- 可增加退出输入的判断逻辑,避免无限循环,比如输入
quit时终止程序。 - 程序退出前遍历二叉树释放所有节点的
data和节点本身的内存,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Dummy0
相关产品推荐
相关产品推荐

