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创建根目录,比如输入
root作为根节点 - 选择菜单2添加子目录,比如输入
root document会在root下创建document目录,输入root download会在root下创建同级的download目录,输入document work会在document下创建work子目录 - 选择菜单3即可看到带层级缩进的完整目录结构
内容的提问来源于stack exchange,提问作者user15702950
相关产品推荐
相关产品推荐

