在c

时间:2017-07-13 13:09:14

标签: c algorithm binary-tree

我是计算机科学专业的学生,​​上周我在C学习了考试。

其中一个问题是搜索二叉树中的特定单词(字符串),并计算它出现的次数。

树中的每个节点都包含一个字母。

例如,如果单词是“mom”,并且树看起来像附加图像,则该函数应返回2。 请注意,如果有这样的单词 - “momom” - 该功能只计算一次“妈妈”。

我无法解决这个问题。你能帮忙吗?

The example of tree

     a
    / \
  b    m
 /    / \
v    o   o
    / \   \
   m   t   m

2 个答案:

答案 0 :(得分:1)

所以基本上,因为图像中的树似乎没有被排序或平衡,所以你必须搜索每个分支,直到你击中一个匹配,或者你击中一个叶子。一旦你匹配,你可以忽略下面的所有分支,因为它们无关紧要。但除此之外,您还不知道树的深度,因此您无法根据深度提前结束搜索。

因此,您的算法将起到以下作用:

// returns the number of matches
// matchMask is a bitmap of the string sublengths that match so far...
int search(const char *substr, int substrlen, uint32_t matchMask, node_t *node) {
     uint16_t newMatchMask = 0;
     int bit;
     ASSERT(substrlen < (sizeof(matchMask)*8));
     if (node == NULL) {
         // hit a leaf, stop return 0
         return 0;
     }

     while (bit = LSB(matchMask) != -1)
     {
         if (node->ch == substr[bit+1])
             newMatchMask |= (1 << (bit+1));
     }
     if (node->ch == substr[0])
          newMatchMask;

     if (newMatchMask & (1 << strlen)) {
         // found a match, don't bother recursing
         return 1;
     } else {
         return 
            search(substr, substrlen, newMatchMask, node->left) +
            search(substr, substrlen, newMatchMask, node->right);
     }
}

注意,我必须在那里做一些时髦的位图来跟踪到目前为止匹配的深度,因为你可以匹配沿途的部分子串。假设LSB是最低有效位宏,如果没有设置位,则返回-1。此外,这没有经过测试,因此在位掩码中可能存在一个一个错误,但是这个想法仍然存在。

- 编辑 -

哎呀,如果您的节点是空白的话,忘了停止递归......修复

答案 1 :(得分:0)

如果您使用strstr()匹配,则需要枚举树中的所有字词并检查字词的每一端。

要搜索的关键字将是树行走树深度优先

您的树结构的语义混淆了。为了澄清您的问题,您应该手动枚举树中存在的所有单词,然后编写一个遍历树并打印相同列表的函数,最后一步很简单:不要打印它们,检查字符串是否与{{{ 1}}并计算匹配的单词。