如何在Python函数中打印目标节点值?解决Trie树插入KeyError报错
问题核心定位
- 本次的
KeyError: 'a'报错和字典初始化无关,完全是代码执行顺序、变量指向逻辑写反导致的:- 进入
if l not in node.children1分支后,你先给当前父节点的children1字典存了新创建的子节点,紧接着第一时间把node变量的指向切到了这个新子节点上 - 后续再执行
print(node.children1[l])时,node已经是那个刚创建、children1为空字典的新子节点了。这时候再用原字符l去查这个新节点的children1,字典里根本没有对应键,自然抛出KeyError。
- 进入
- 原代码的Trie设计本身也存在偏差:你把
node.valid = True写在了新建节点的分支里,等于每一层的中间节点都会被标记成有效单词结尾,不符合Trie的常规逻辑——应该等遍历完单词的所有字符后,给最后停留的节点设置valid=True才对。
正确的打印实现方式
- 不需要绕路从已经切换指向的node里二次查字典,新建节点时直接把节点引用存为临时变量,想打印节点的任何属性直接读临时变量就行,从根源上避免KeyError:
def insert(self, word: str) -> None: node = self.root for l in word: if l not in node.children1: # 新建子节点,直接存为临时变量 new_child = trie_node() node.children1[l] = new_child # 直接打印目标节点,完全不需要二次查字典 print(f"当前新建的目标节点对象: {new_child}") print(f"目标节点对应字符: {l}, 子节点字典: {new_child.children1}, valid状态: {new_child.valid}") # 等完成新建、打印逻辑后,再统一把node切到当前层的子节点 node = node.children1[l] # 遍历完整个单词,给最后停留的节点标记valid=True node.valid = True - 额外注意:调用
obj.insert('apple')时不要额外套print,因为insert方法没有返回值,套了最后只会输出None,所有需要打印的内容直接写在insert方法内部即可。
内容的提问来源于stack exchange,提问作者Frank
相关产品推荐
相关产品推荐

