我有一份功课,完成了大部分工作,但我已经陷入了困境。 我必须在二叉树中搜索并找到一个关键字,如果关键字没有显示,我必须在树上找到按字典顺序排列的下一个字符串,作为我想要找到的关键字的前缀,直到没有其他字符串满足以前的标准。
下面的代码是用于搜索后我找不到确切的单词。
int successor(TreeNode *v,char* x){
int lenght = strlen(x);
printf("%d\n", lenght);
if (v != NULL) {
if (strncmp(x , v->key, lenght) == 0)
{
// found
printf("%s, %d\n", v->key, v->appears);
}
else if (strncmp(x , v->key, lenght) < 0)
return successor(v->left, x);
else if (strncmp( x , v->key, lenght) > 0)
return successor(v->right, x);
else
printf("Query string not found.\n");
}
}
else return 0; }
实施例
如果我有话: 树遍历树
tree <---(not root)
traversal trees
如果我搜索:&#34; tr&#34;
我只得到了遍历。
在遍历原因是叶子之后,我无法左右移动,我也找不到出现树木和树木的方法。
我尝试了一些东西,但它没有成功,所以现在我问你,除此之外,我甚至不知道如何处理字典下一个关键字或我必须做什么用它!
任何帮助表示赞赏! :d
答案 0 :(得分:2)
要打印包含搜索关键字的所有单词,您必须遍历树,因为无法预先知道任何后代是否匹配。
要遍历树,您可以使用与此类似的功能:
void
bin_tree_search_inorder(struct TreeNode *t)
{
if (t == NULL)
return;
bin_tree_search_inorder(t->left);
// do check here
bin_tree_search_inorder(t->right);
}
此功能的工作原理是尽可能地向左移动二叉树,然后重复从底部向右移动到第一个树。
要检查前缀是否包含,您可以使用strstr
功能:
if (strstr(t->key, key) != 0)
printf("\nMatch: [%s]", t->key);
else
printf("\nDoesn't match: [%s]", t->key);
要限制搜索区域,您可以考虑只要有可能在树下找到匹配项就继续搜索,并且您可以更精确地说明:您确切知道何时使用向右,向左或两者兼而有之。
void
bin_tree_search_inorder(struct t *t, char *key)
{
int res;
if (t == NULL)
return;
if (strstr(t->key, key) != 0)
{
printf("\nMatch: [%s]", t->key);
bin_tree_search_inorder(t->l, key);
bin_tree_search_inorder(t->r, key);
} else {
printf("\nDoesn't match: [%s]", t->key);
if (strlen(t->key) >= strlen(key))
{
res = strcmp(key, t->key);
if (res > 0)
bin_tree_search_inorder(t->l, key);
else
bin_tree_search_inorder(t->r, key);
}
}
}
用法:
int
main(void)
{
struct t root, l, r, rl, rr, ll, lr;
strcpy(&root.key, "tree");
strcpy(&l.key, "traversal");
strcpy(r.key, "trees");
root.l = &l;
root.r = &r;
l.l = l.r = r.l = r.r = NULL;
strcpy(rl.key, "tre");
strcpy(rr.key, "tx");
r.l = &rl;
r.r = &rr;
rl.l = rl.r = rr.l = rr.r = NULL;
strcpy(ll.key, "ta");
strcpy(lr.key, "travvv");
l.l = ≪
l.r = &lr;
ll.l = ll.r = lr.l = lr.r = NULL;
bin_tree_search_inorder(&root, "tr");
return 0;
}
<强>输出:强>
不匹配:[ta]
匹配:[遍历]
匹配:[travvv]
匹配:[树]
匹配:[tre]
匹配:[树]
不匹配:[tx]