搜索二叉树C,词典顺序,下一个排列,递归

时间:2016-01-12 00:24:04

标签: c algorithm binary-search-tree permutation lexicographic

我有一份功课,完成了大部分工作,但我已经陷入了困境。 我必须在二叉树中搜索并找到一个关键字,如果关键字没有显示,我必须在树上找到按字典顺序排列的下一个字符串,作为我想要找到的关键字的前缀,直到没有其他字符串满足以前的标准。

下面的代码是用于搜索后我找不到确切的单词。

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

1 个答案:

答案 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);
        }
    }
} 

Working code

用法:

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 = &ll;
    l.r = &lr;
    ll.l = ll.r = lr.l = lr.r = NULL;
    bin_tree_search_inorder(&root, "tr");
    return 0;
}

<强>输出:

不匹配:[ta]

匹配:[遍历]

匹配:[travvv]

匹配:[树]

匹配:[tre]

匹配:[树]

不匹配:[tx]