【问题标题】:Search Binary Tree C, Lexicographic order, next permutation, recursive搜索二叉树 C、字典顺序、下一个排列、递归
【发布时间】:2016-04-16 11:21:06
【问题描述】:

我有一个家庭作业,大部分都完成了,但我卡在了一个点上。 我必须搜索一棵二叉树并找到一个关键字,如果关键字没有出现,我必须在树上找到按字典顺序排列的下一个字符串,女巫以我想要查找的关键字作为前缀,直到没有其他字符串满足以前的标准。

下面的代码是在我没有找到确切的单词后搜索的。

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

如果我搜索:“tr”

我只得到遍历。

遍历原因是一片叶子后我不能向左或向右走,而且我也找不到出现树和树的方法。

我尝试了一些方法,但没有成功,所以现在我问你,除此之外,我什至不知道如何处理按字典顺序排列的 next 关键字,也不知道如何处理它!

任何帮助表示赞赏! :D

【问题讨论】:

  • traversal 不是你想去的地方吗?它是单词(其中显示的三个)在“tr”之后的字典顺序,对吧?
  • @MDims 那么你想做什么?你的代码做你想做的事,它按字典顺序搜索。如果字符串包含搜索词,您要打印字符串吗?
  • 对不起,我对问题进行了更改。 " ... 按字典顺序,树女巫的下一个字符串以我要查找的关键字作为前缀,直到没有其他字符串满足前面的条件。"
  • 那么根据例子应该是什么结果?
  • 他们三个,树比这个大。根据示例,如果我搜索 tr,我必须返回这三个词,而不仅仅是第一个词。

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


【解决方案1】:

要打印所有包含搜索关键字的单词,您必须遍历树,因为无法提前知道是否有任何后代匹配。

基本方法

要遍历树,您可以使用类似于以下的函数:

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]

【讨论】:

  • 嗯,它不起作用或者我做错了什么。我有同样的结果。我所做的更改是void successor(TreeNode *v,char* x)int lenght = strlen(x); 以及将递归更改为马赫。 if 检查是您评论的地方。
  • @Mdims 你应该从底部放置代码来代替 // do(...)。我已附上工作代码的链接。
  • 抱歉,我的代码出错了,因为我在另一个函数中调用了bin_tree_search_inorder,它只显示了第一个结果。谢谢你的回答小伙伴! :D
猜你喜欢
  • 1970-01-01
  • 2013-04-14
  • 1970-01-01
  • 2014-01-02
  • 1970-01-01
  • 2017-07-06
  • 2021-07-03
  • 2019-04-17
  • 1970-01-01
相关资源
最近更新 更多