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

Python实现AVL树插入节点时出现NoneType无rightnode属性报错求解

AVL树实现插入操作时报错解决方案

问题根因

你的代码存在两个核心逻辑错误:

  • 递归插入未接收返回值:insertnode函数递归向左右子树插入节点时,仅调用了insertnode(rootnode.leftnode,nodevalue)/insertnode(rootnode.rightnode,nodevalue),没有将子树旋转后返回的新根节点赋值给当前节点的对应子节点,导致子树结构更新无法同步到上层,触发后续平衡判断异常。
  • RL/RR失衡判断条件写反:右子树过重(balance < -1)时的两个旋转条件写反,导致本来属于RR型的失衡触发了RL型的处理逻辑,对无左子节点的节点调用rightrotation,最终抛出NoneType无rightnode属性的错误。

修复方案

修正insertnode函数逻辑

def insertnode(rootnode,nodevalue):
    # 原判断rootnode.data is None逻辑不合理,改为直接判断节点是否为空,统一插入逻辑
    if not rootnode:
        return AVL(nodevalue)
    elif nodevalue < rootnode.data:
        # 接收递归返回的子树新根,赋值给左子节点
        rootnode.leftnode = insertnode(rootnode.leftnode, nodevalue)
    else:
        # 接收递归返回的子树新根,赋值给右子节点
        rootnode.rightnode = insertnode(rootnode.rightnode, nodevalue)

    rootnode.height = 1 + max(getheight(rootnode.leftnode), getheight(rootnode.rightnode))
    balance = getbalance(rootnode)
    
    # LL型失衡 直接右旋
    if balance > 1 and nodevalue < rootnode.leftnode.data:
        return rightrotation(rootnode)
    # LR型失衡 先左旋左子树再右旋
    if balance > 1 and nodevalue > rootnode.leftnode.data:
        rootnode.leftnode = leftrotation(rootnode.leftnode)
        return rightrotation(rootnode)
    # RR型失衡 直接左旋(原条件写反,已修正)
    if balance < -1 and nodevalue > rootnode.rightnode.data:
        return leftrotation(rootnode)
    # RL型失衡 先右旋右子树再左旋(原条件写反,已修正)
    if balance < -1 and nodevalue < rootnode.rightnode.data:
        rootnode.rightnode = rightrotation(rootnode.rightnode)
        return leftrotation(rootnode)
    return rootnode

测试运行

修复后运行你的测试代码,层序遍历输出结果为:

10
5
15
20

完全符合你预期的旋转后树结构。


内容的提问来源于stack exchange,提问作者Super Ultra Noob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:57:02