帮助Trie实施

时间:2011-05-18 09:20:13

标签: c trie

我一直在尝试实现将字符插入C语言中的trie数据结构的基本功能。我一直在试图弄清楚我做错了什么,但是在最后一天左右我被困住/卡住了。

我写了一些代码:

TR head = NULL;

void initDict () {
  head = NULL;
}

TR newNode (char item) {
  TR temp;
  temp = malloc (sizeof(*temp));
  temp->thisChar = item;
  temp->child = NULL;
  temp->sibling = NULL;
  return temp;
}


TR insertInOrder (char item, TR trie) {
  if (trie == NULL) {
    trie = newNode(item);
  } else if (trie->thisChar < item) {
        insertInOrder(item, trie->sibling);
    } else if (trie->thisChar > item) {
        char temp = trie->thisChar;
        trie->thisChar = item;
        insertInOrder(temp, trie->sibling);
    }
    return trie;
}

void insert (char *word) {
  char letter = *word;
    TR temp = NULL;

    while (*word != '\0') {
        letter = *word;
        if (head == NULL) {
            head = newNode(letter);
            temp = head->child;
            word++;
        } else {
            temp = insertInOrder(letter, temp);
            temp->child = head->child;
            head->child = temp;
            word++;
        }
    }
}

我无法弄明白......

P.S checkLetter,是一个布尔函数,用于检查字母是否已经在trie中(通过遍历trie结构,即trie = trie-&gt;兄弟)

任何帮助将不胜感激=]

干杯!

编辑:更改了我的代码,以便insertInOrder返回一个值,但由于insert是一个void函数并且必须保持void函数,所以我不知道如何将节点进一步插入到trie的头部(即head-&gt; child,head-&gt; child-&gt; child等)

2 个答案:

答案 0 :(得分:1)

在insertInOrder函数开始时,检查是否需要分配新节点。然后,如果需要,您可以分配一个新节点,但是将新节点的地址存储在您返回后立即消失的本地节点中。

感觉就像insertInOrder函数应该返回一个TR,插入做了什么好事?

答案 1 :(得分:0)

您可以重新考虑插入算法: - )

我不是一个很好的老师,所以我会给你解决方案而没有任何好的动机。这不是经过编译和验证的,可以把它想象成伪代码,让你知道我认为是一个更好的算法来处理你似乎错过的一些极端情况,再加上使用'head'指针来产生一个更一致的算法:

// 'head' is assumed to be a valid pointer, its 'child' field either NULL or a valid 
// pointer
TR currentNode = head;
while ( *word )
{
    assert(currentNode != NULL);

    if ( currentNode->child == NULL || currentNode->child->thisChar < *word )
    {
        // We need to insert a new node first in the child list
        TR newNode = malloc(sizeof *currentNode);
        newNode->thisChar = *word;
        newNode->sibling = currentNode->child;
        newNode->child = NULL;
        currentNode->child = newNode;
        currentNode = newNode;
    }
    else
    {
        // Find the place to insert next node
        currentNode = currentNode->child;
        while ( currentNode->sibling && currentNode->thisChar < *word )
            currentNode = currentNode->sibling;

        // If the current node already represents current character, we're done
        // Otherwise, insert a new node between the current node and its sibling
        if ( currentNode->thisChar != *word )
        {
            TR newNode = malloc(sizeof *currentNode);
            newNode->thisChar = *word;
            newNode->child = NULL;
            newNode->sibling = currentNode->sibling;
            currentNode->sibling = newNode;
            currentNode = newNode;
        }
    }
    word++;
}