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

BST插入摩尔斯码异常:Insert函数重复插入相同编码问题排查

问题分析与修复方案

我一眼就瞅出问题所在了——你的Insert(string key)方法里的循环逻辑完全跑偏了,直接导致同一个摩尔斯码被重复插入了N次(N等于该摩尔斯码的长度)!

问题根源拆解

看你这段公开的Insert代码:

void BST::Insert(string key) { 
    node **start = &root; 
    if (*start != NULL) { 
        for(int i = 0; i < key.length(); i++) { 
            assert(*start); 
            if (key[i] == '.') { 
                start = &((*start)->left); 
            } else if (key[i] == '-') { 
                start = &((*start)->right); 
            }else { 
                break; 
            } 
            Insert(*start, key); // 这里是罪魁祸首!
        } 
    } else { 
        Insert(root, key); 
    } 
}

你在循环的每一次迭代里都调用了辅助Insert函数。比如摩尔斯码-...的长度是4,循环会跑4次,每次都插入同一个-...,这正好和你输出里它出现4次的情况完全对应。

正确的逻辑应该是:沿着摩尔斯码的字符路径(.走左子节点,-走右子节点)遍历到空节点的位置,然后只插入一次,而不是每走一步就插一次。

修复后的代码

把公开的Insert方法改成这样:

void BST::Insert(string key) {
    node **start = &root;
    
    // 先沿着摩尔斯码路径遍历到目标位置
    for(int i = 0; i < key.length(); i++) {
        // 如果中途遇到空节点,直接跳出循环准备插入
        if (*start == NULL) {
            break;
        }
        if (key[i] == '.') {
            start = &((*start)->left);
        } else if (key[i] == '-') {
            start = &((*start)->right);
        } else {
            // 遇到非摩尔斯字符,停止遍历
            break;
        }
    }
    
    // 现在start指向的就是要插入的空位置,只插入一次
    Insert(*start, key);
}

额外提醒

你的辅助Insert函数目前只初始化了code和左右子节点,如果你需要在节点中存储摩尔斯码对应的明文(比如a-z、0-9),记得补充初始化对应的字段,不过这不是当前重复插入问题的诱因。

修改后,同一个摩尔斯码只会被插入一次,和你的输入内容保持一致,不会再出现重复插入的情况了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:46:33