摩尔斯码二叉树解密程序仅输出首字母的问题解决求助
解决摩尔斯码二叉树解密仅输出第一个字符的问题
Hey,我看了你的代码,问题出在递归逻辑的处理和结果收集上,咱们一步步来修复:
核心问题分析
- 递归未回溯+无结果返回:你当前的递归函数找到第一个字符后,没有回到根节点
Arriba,后续的摩尔斯码会从当前节点继续遍历,而不是重新从树的顶部开始,自然只能解析第一个字符。 - 结果收集逻辑错误:
lista在循环里每次都重新初始化,根本存不下多个字符,而且打印语句放在循环里会重复输出提示信息。 - 全局变量的冗余与风险:虽然
index用全局变量能工作,但改成直接遍历字符串的方式更直观,也避免了全局状态污染的问题。
修改后的完整代码
class Tree: def __init__(self, data): self.data = data self.izq = None self.der = None # 保留你原来正确的摩尔斯码二叉树构建逻辑 Arriba = Tree (" ") Arriba.izq = Tree("E") Arriba.der = Tree("T") Arriba.izq.izq = Tree("I") Arriba.izq.der = Tree("A") Arriba.der.izq = Tree("N") Arriba.der.der = Tree("M") Arriba.izq.izq.izq = Tree("S") Arriba.izq.izq.der = Tree("U") Arriba.izq.der.izq = Tree("R") Arriba.izq.der.der = Tree("W") Arriba.der.izq.izq = Tree("D") Arriba.der.izq.der = Tree("K") Arriba.der.der.izq = Tree("G") Arriba.der.der.der = Tree("O") Arriba.izq.izq.izq.izq = Tree("H") Arriba.izq.izq.izq.der= Tree("V") Arriba.izq.izq.der.izq = Tree("F") Arriba.izq.der.izq.izq = Tree("L") Arriba.izq.der.der.izq = Tree("P") Arriba.izq.der.der.der = Tree("J") Arriba.der.izq.izq.izq = Tree("B") Arriba.der.izq.izq.der = Tree("X") Arriba.der.izq.der.izq = Tree("C") Arriba.der.izq.der.der = Tree("Y") Arriba.der.der.izq.izq = Tree("Z") Arriba.der.der.izq.der = Tree("Q") texto = input("Digite el mensaje cifrado: ") def decifrar_morse(raiz, mensaje): resultado = [] nodo_actual = raiz for char in mensaje: if char == ".": # 点对应左子树,存在则移动节点 if nodo_actual.izq: nodo_actual = nodo_actual.izq elif char == "-": # 划对应右子树,存在则移动节点 if nodo_actual.der: nodo_actual = nodo_actual.der elif char == " ": # 空格表示单个字符结束,加入结果并回到根节点 resultado.append(nodo_actual.data) nodo_actual = raiz elif char == "/": # 斜杠表示单词分隔,加入空格并回到根节点 resultado.append(" ") nodo_actual = raiz # 处理最后一个字符(如果输入结尾没有空格) resultado.append(nodo_actual.data) return "".join(resultado) # 执行解密并打印最终结果 mensaje_descifrado = decifrar_morse(Arriba, texto) print("Su mensaje es:") print(mensaje_descifrado)
关键修改点说明
- 移除全局
index:改用直接遍历输入字符串的方式,逻辑更清晰,也避免了全局变量带来的意外问题。 - 统一结果收集:用
resultado列表存储所有解析后的字符,最后通过join拼接成完整字符串,避免零散打印的混乱。 - 强制回溯到根:每次遇到字符分隔符(空格)或单词分隔符(斜杠)时,立即把当前节点重置为根节点,确保下一个字符的解析从树的顶部重新开始。
- 兼容结尾无分隔符的情况:循环结束后主动把最后一个解析的字符加入结果,避免遗漏输入末尾的字符。
举个测试例子:如果输入.... . .-.. .-.. --- / .-- --- .-. .-.. -..,解密后会输出HELLO WORLD。
内容的提问来源于stack exchange,提问作者Angelusmax
相关产品推荐
相关产品推荐

