【问题标题】:Searching a string in a binary tree in c在c中搜索二叉树中的字符串
【发布时间】:2017-12-18 07:02:38
【问题描述】:

我是一名计算机科学专业的学生,​​上周我参加了 C 考试。

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

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

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

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

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

【问题讨论】:

  • 如果这个词的所有字母都在树中,那么这个词就在树中?
  • 是的,但按顺序
  • 所以,基本上,你有一本字典,并且正在寻找所有具有特定子字符串的单词......
  • 注意,您应该将图片添加到您的问题中,而不是添加链接。
  • 每个节点都是一个字母?你没有一棵树,你有一个trie

标签: c algorithm binary-tree


【解决方案1】:

您想枚举树中的所有单词并检查单词的每个结尾是否使用strstr() 匹配。

要搜索的关键字是tree walk tree depth-first

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

【讨论】:

  • 是的,这是测试中的任务,但我还没有解决。我试着照你说的做,但没有成功
  • 你应该发布树结构和语义的确切定义。
  • typedef struct tnode { char ch;结构 tnode *left;结构 tnode *right; }节点; typedef 结构树 { TNODE *root; }树;
  • 是的,但是在你的树中你有什么词呢?从根开始的任何路径?
  • 在发布的树示例中,amoab 是否认为单词存在于树中?
【解决方案2】:

因此,基本上,因为您图像中的树看起来不是有序或平衡的,所以您必须搜索每个分支,直到找到匹配项或找到叶子。一旦你打了一场比赛,你可以忽略下面的所有分支,因为它们无关紧要。但除此之外,您不知道树的深度,因此您无法根据深度提前结束搜索。

因此,您的算法将具有以下效果:

// 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。另外,这没有经过测试,因此位掩码中可能存在一个错误,但这个想法仍然存在。

-- 编辑--

糟糕,如果您的节点为空白,忘记停止递归...正在修复

【讨论】:

    猜你喜欢
    • 2017-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多