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

Python递归实现Trie树插入功能出现节点位置错误求助

Trie树递归插入函数的问题分析与修复

问题根源

原insert函数的核心错误在于:

  • 匹配到当前字符时,直接取节点的最后一个子节点继续递归,而非在子节点中查找匹配下一个字符的节点,导致后续字符错误追加到之前插入单词的末尾节点下(比如"card"的'r'被加到了"cat"的't'节点下)。
  • 插入逻辑未区分"当前节点子节点已有目标字符"和"需要新增节点"的场景,路径选择完全错误。

修复后的代码

调整递归逻辑,每次处理字符时优先遍历子节点查找匹配项,不存在则新建节点:

class trie :
    def __init__(self, char):
        self.char = char
        self.children = []
    def __repr__ (self):
        return "%s %s" %(self.char, self.children)
    def __str__ (self):
        return "[%s %s]" %(self.char, self.children)

def insert(root, word):
    # 单词为空时结束递归
    if not word:
        return "FIN"
    
    current_char = word[0]
    # 遍历子节点,查找匹配当前字符的节点
    for child in root.children:
        if child.char == current_char:
            # 找到匹配节点,递归处理剩余单词
            return insert(child, word[1:])
    
    # 无匹配节点,创建新节点并添加到子列表
    new_node = trie(current_char)
    root.children.append(new_node)
    # 递归处理剩余单词
    return insert(new_node, word[1:])

测试验证

运行原测试代码:

t = trie("#") # root
insert(t, "cat")
insert(t, "card")
insert(t, "dog")
print(t)

输出结果:
[# [[c [a [t []], r [d []]]], [d [o [g []]]]]]
根节点#的子结构完全符合预期,a的子节点包含t和r,解决了原问题。

额外说明

  • 原代码中的rest函数可直接移除,修复后的逻辑不再依赖"取最后一个子节点"的操作。
  • 插入"card"时,会在a的子节点中查找r,未找到则新建节点挂载到a下,确保路径正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 05:25:24