我试图了解为什么我的Insert(string key)无法正确地对摩尔斯电码(a-z 0-9)进行排序。从输出看来,它正在排序完全相同的莫尔斯电码。这使我相信问题出在我的插入函数,因为送入插入函数的莫尔斯电码不包含任何重复项。

void BST::Insert(node *&start, string key){
    if (start == NULL) {
        start = new node;
        start->code = key;
        start->left = start->right = NULL;
        printf("Inserting Morse Code -> %s\n",key.c_str());
    }
}


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);
    }
}

我正在产生的输出是:
Inserting Morse Code -> .-
Inserting Morse Code -> -...
Inserting Morse Code -> -...
Inserting Morse Code -> -...
Inserting Morse Code -> -...
Inserting Morse Code -> -.-.
Inserting Morse Code -> -.-.
Inserting Morse Code -> .
Inserting Morse Code -> ..-.
Inserting Morse Code -> ..-.
Inserting Morse Code -> ..-.
Inserting Morse Code -> --.
Inserting Morse Code -> --.
Inserting Morse Code -> ....
Inserting Morse Code -> ....
Inserting Morse Code -> .---
Inserting Morse Code -> .---
Inserting Morse Code -> .---
Inserting Morse Code -> .-..
Inserting Morse Code -> .-..
Inserting Morse Code -> ---
Inserting Morse Code -> .--.
Inserting Morse Code -> --.-
Inserting Morse Code -> ...-
Inserting Morse Code -> -..-
Inserting Morse Code -> -.--
Inserting Morse Code -> --..
Inserting Morse Code -> ----
Inserting Morse Code -> .----
Inserting Morse Code -> ..---
Inserting Morse Code -> ..---
Inserting Morse Code -> ...--
Inserting Morse Code -> ....-
Inserting Morse Code -> .....
Inserting Morse Code -> -....
Inserting Morse Code -> --...
Inserting Morse Code -> ---..
Inserting Morse Code -> ---..
Inserting Morse Code -> ----.
.....
....
....-
....
...-
...--
..-.
..-.
..-.
..---
..---
.
.-..
.-..
.---
.--.
.---
.---
.----
.-
-....
-...
-...
-..-
-...
-.-.
-.-.
-.--
-...
--...
--..
--.
--.-
--.
---..
---..
---
----.
----

最佳答案

有什么问题 ?

您的Insert(*start, key);for循环的主体中,该循环重复直到达到字符串的长度。因此,当插入4个莫尔斯电码的代码时,您将插入4次。唯一的异常(exception)是第一次插入,因为这是一个没有for循环的分支。

怎么解决呢?

您需要将密钥与当前代码进行比较,以确定是向左插入还是向右插入。当前,您正在尝试通过混合不合适的迭代和递归方法来解决此问题。

更好的方法是使用公共(public)前端功能:

void BST::Insert(string key) {
    Insert(root, key);
    }

并使辅助函数私有(private)和递归:
void BST::Insert(node *&start, string key){
    if (start == nullptr) {    // new node must be created
        start = new node;
        start->code = key;    // better move this to the node constructor
        start->left = start->right = nullptr;  // same here
        printf("Inserting Morse Code -> %s\n",key.c_str());
    }
    else if (start->code<key)
        Insert (start->left, key);
    else if (start->code>key)
        Insert (start->right, key);
    else cout<<"Duplicate"<<endl;
}

Online demo

您可能需要修改评估订单的方式。

现在,由于它始终是相同的键,因此您可以将键作为const string&传递,以避免递归中不必要的副本。

关于c++ - 无法将莫尔斯电码分类到二叉树中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55432556/

10-11 00:44