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

摩尔斯码二叉树解密程序仅输出首字母的问题解决求助

解决摩尔斯码二叉树解密仅输出第一个字符的问题

Hey,我看了你的代码,问题出在递归逻辑的处理和结果收集上,咱们一步步来修复:

核心问题分析

  1. 递归未回溯+无结果返回:你当前的递归函数找到第一个字符后,没有回到根节点Arriba,后续的摩尔斯码会从当前节点继续遍历,而不是重新从树的顶部开始,自然只能解析第一个字符。
  2. 结果收集逻辑错误:lista在循环里每次都重新初始化,根本存不下多个字符,而且打印语句放在循环里会重复输出提示信息。
  3. 全局变量的冗余与风险:虽然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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 17:12:42