我是计算机科学专业的学生,上周我在C学习了考试。
其中一个问题是搜索二叉树中的特定单词(字符串),并计算它出现的次数。
树中的每个节点都包含一个字母。
例如,如果单词是“mom”,并且树看起来像附加图像,则该函数应返回2。 请注意,如果有这样的单词 - “momom” - 该功能只计算一次“妈妈”。
我无法解决这个问题。你能帮忙吗?
a
/ \
b m
/ / \
v o o
/ \ \
m t m
答案 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}}并计算匹配的单词。