AVL树前序遍历输出丢失、仅调用insert初始化报错如何解决
AVL树程序问题修复方案
问题1:根节点内容截断、遍历信息丢失修复
问题原因
AVL树发生旋转操作后,根节点会发生变化,你编写的insert、deleteN函数均会返回旋转后的新根节点指针,但你在main函数中调用这两个函数时,没有接收返回值更新本地存储的根节点变量,导致root一直指向旧的根节点,自然会出现内容丢失、遍历结果异常的问题。
修复方法
修改main函数中调用insert和deleteN的语句,将返回值赋值给root变量:
- 原
insert(root, number2);改为root = insert(root, number2); - 原
deleteN(root, number2);改为root = deleteN(root, number2);
问题2:取消单独根节点插入逻辑修复
问题原因
你的insert函数本身已经内置了根节点为空时自动创建新节点的逻辑,不需要单独编写根节点初始化代码,之前报错是因为你没有将root初始化为NULL,野指针判断逻辑失效导致。
修复步骤
- 定义
root变量时直接初始化为NULL:struct node *root = NULL; - 删除原来单独处理根节点输入的3行代码:
printf("Insert root number:"); scanf("%d", &number); root = newNode(number);
修改后程序启动会直接进入switch菜单,第一次执行插入操作时会自动创建根节点,符合你的设计要求。
修改后的完整main函数代码
int main() { struct node *root = NULL; int number2; int number3; bool bOnLoop = true; while (bOnLoop) { printf("\n1.Insert 2.Delete 3.Search 4.Preorder 5.End\n"); printf("Select Mode Number:"); scanf("%d", &number3); switch (number3) { case 1: printf("Insert Number:"); scanf("%d", &number2); root = insert(root, number2); break; case 2: printf("Insert Number:"); scanf("%d", &number2); root = deleteN(root, number2); break; case 3: printf("Insert Number:"); scanf("%d", &number2); search(root, number2); break; case 4: preorder(root); break; case 5: bOnLoop = false; break; } } return 0; }
其他优化建议
你现有代码中打印旋转信息的printf语句大多没有加换行符,会导致输出内容和后续菜单混在一起,建议给所有打印语句末尾加上\n即可。
内容的提问来源于stack exchange,提问作者이건웅
相关产品推荐
相关产品推荐

