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

C语言AVL树通过左旋转转主干链时左旋转函数异常如何解决

现有左旋转函数的问题

  • 旋转逻辑不完整:标准左旋操作需要将左孩子的右指针固定指向当前父节点,你的代码仅在左孩子无右子节点时才做该赋值,左孩子存在右子节点时直接断链,结构完全错误。
  • 没有返回旋转后的新根节点:左旋后原父节点会变成左孩子的右子节点,子树的根会发生变化,你的函数返回void,无法将新的根向上传递,更无法更新整棵树的根节点。
  • 递归顺序错误:你没有先递归处理左子树的所有左节点,直接旋转会导致左子树内部的左节点残留,无法形成完整的主干链。
  • 根节点未更新:主函数调用left_rotate时直接传原根,旋转后原根已经不是整棵树的根,tree->root指针没有修改,会导致树结构丢失、打印异常。

修改方案

你要实现的是将BST转换为仅存在右子节点的递增右主干链,按如下修改即可:

1. 修改左旋转函数,支持返回新根,补全旋转逻辑

NODE left_rotate(NODE parent) {
    // 空节点或无左子节点,无需旋转,直接返回当前节点作为根
    if (parent == NULL || parent->left == NULL) {
        return parent;
    }
    // 先递归处理左子树,把左子树先全部转成右链
    NODE left_child = left_rotate(parent->left);
    // 执行标准左旋
    parent->left = left_child->right;
    left_child->right = parent;
    // 返回旋转后的新根(原左孩子)
    return left_child;
}

2. 修改主函数调用逻辑,更新树的根节点

把主函数中left_rotate(tree1->root);替换为:

tree1->root = left_rotate(tree1->root);

修改后运行打印,即可看到输出为从大到小缩进的递增右链,所有节点仅存在右子节点,符合主干链需求。

内容的提问来源于stack exchange,提问作者Koray Can Yılmaz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 05:54:03