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

Python实现二叉树文件目录案例时Insert方法运行异常求助

代码问题排查与修复

核心错误点

  • 条件判断逻辑重复:insert方法中两个分支的判断条件完全相同,都是newData[0] != self.data,导致右节点分支永远不会被触发
  • 递归参数错误:递归调用insert时只传递了子节点名称字符串,而方法要求传入包含父节点、子节点的完整列表,会触发索引越界报错
  • 父节点匹配逻辑缺失:现有逻辑没有做父节点查找,只要当前节点数据不等于输入的父节点名就直接往左子树插,完全无法实现指定父节点下挂载子节点的需求
  • 缺少边界校验:未初始化根节点时直接操作插入、遍历会抛出变量未定义的错误
  • HTML转义字符残留:代码中的"是HTML转义后的引号,需要替换为普通双引号/单引号

修复后代码

以下是适配左孩子右兄弟二叉树规则的文件目录实现,符合常规目录结构的存储逻辑:

class Node:
    def __init__(self, data):
        self.right = None  # 存储同级兄弟节点
        self.left = None   # 存储第一个子节点
        self.data = data

    def insert(self, new_data):
        # new_data 格式为 [父节点名, 子节点名]
        parent_name, child_name = new_data
        # 先判断当前节点是不是目标父节点
        if self.data == parent_name:
            # 父节点无任何子节点时,直接挂载到左节点
            if self.left is None:
                self.left = Node(child_name)
            else:
                # 已有子节点时,找到最后一个同级兄弟节点挂载
                current_sibling = self.left
                while current_sibling.right is not None:
                    current_sibling = current_sibling.right
                current_sibling.right = Node(child_name)
            return True
        # 递归查找子树
        if self.left is not None:
            if self.left.insert(new_data):
                return True
        # 递归查找兄弟树
        if self.right is not None:
            if self.right.insert(new_data):
                return True
        return False

    def pre_order_traversal(self, root, level=0):
        # 优化遍历输出,带缩进显示目录层级
        result = []
        if root:
            result.append("  " * level + root.data)
            # 遍历子节点时层级+1
            result.extend(self.pre_order_traversal(root.left, level + 1))
            # 遍历兄弟节点时层级不变
            result.extend(self.pre_order_traversal(root.right, level))
        return result

# 菜单逻辑
root = None
while True:
    print("\n===== 目录操作菜单 =====")
    print("1. 创建根目录")
    print("2. 添加子目录(输入格式:父目录名 子目录名)")
    print("3. 输出目录结构")
    print("4. 退出")
    try:
        menu = int(input("请选择菜单: "))
        if menu == 1:
            file_root = input("请输入根目录名: ")
            root = Node(file_root)
            print("根目录创建成功")
        elif menu == 2:
            if not root:
                print("请先创建根目录")
                continue
            file_child = input("请输入父目录和子目录,空格分隔: ")
            parts = file_child.split()
            if len(parts) != 2:
                print("输入格式错误,请按照「父目录 子目录」的格式输入")
                continue
            success = root.insert(parts)
            if not success:
                print(f"未找到父目录{parts[0]},添加失败")
            else:
                print("子目录添加成功")
        elif menu == 3:
            if not root:
                print("请先创建根目录")
                continue
            print("\n当前目录结构:")
            for line in root.pre_order_traversal(root):
                print(line)
        elif menu == 4:
            print("退出程序")
            break
        else:
            print("菜单编号不存在,请重新输入")
    except ValueError:
        print("请输入数字选择菜单")

使用说明

  1. 先选择菜单1创建根目录,比如输入root作为根节点
  2. 选择菜单2添加子目录,比如输入root document会在root下创建document目录,输入root download会在root下创建同级的download目录,输入document work会在document下创建work子目录
  3. 选择菜单3即可看到带层级缩进的完整目录结构

内容的提问来源于stack exchange,提问作者user15702950

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 11:06:04