当前位置: 首页 > 知识库问答 >
问题:

三进制搜索trie插入函数问题

赵健柏
2023-03-14

所以我试着做一个三元搜索。现在,我只处理插入函数。我已经理解了三元搜索的基本思想。我知道一个根节点有3个叶子,如果字符在根之前,它就会在左边,在右边之后,如果它匹配根,它就会在中间的叶子上。因此,我的主要目标是制作一个程序,可以为拼写错误的用户输入的单词提供建议。但现在我只是在做三元搜索。我用trie做了一本字典,用它检查用户输入的单词,以建议下一个最好的选择。但是现在,只是在三进制trie中输入一些字符,当我显示它时,应该按顺序显示它。我不是100%确定我的逻辑关于中间的叶子。现在我的程序,当运行时,给我一些垃圾无限值,不知何故与最后输入的字符有关。我不知道哪里出了问题。谁能指出我犯错的地方吗?还有,你能告诉我,我写的逻辑有没有错?我的意思是,你不必给我代码或任何东西,因为我觉得一旦我明白我哪里出错了,我就有能力自己做,但如果有人能帮我找到我的错误,这将对我帮助很大!

整个代码

#include <stdio.h>
#include <stdlib.h>  //Because usage of malloc gives warnings without this header
typedef struct tstree
{
    struct tstree *lokid;
    struct tstree *hikid;
    struct tstree *eqkid;
    char letter;
}node;
node *head = NULL;
int count = 0;
int insert(char x, node **head)
{
    if (*head==NULL)            //If it's the first element
    {
        *head = malloc(sizeof(node));   
        (*head)->letter = x;
        count++;            
        (*head)->lokid = (*head)->hikid = (*head)->eqkid = NULL;            //Assign all 3 to null initially
    }
    else if ((*head)->letter == x)          //If equal, insert below
    insert(x , &((*head)->eqkid) );
    else if ((*head)->letter > x)   //If inserted char comes before current val, insert to left
    insert(x,&(*head)->lokid);
    else
    insert(x,&(*head)->hikid);              //Else to the right
    return 0;
}
void display(node *head)
{
    if(head)
    {
        display(head->lokid);               //print in infix order
        printf("%c ",head->letter);
        display(head->hikid);
    }
    //return 0;
}
int main()
{   
    int op;
    char num;
    printf("\nWelcome Fabiz. Hope it meets your expectations!\n");
    while(1)
    {
        printf("\n1. To insert an element\n2. Display the tree\n3. Exit\nOption :");
        scanf("%d",&op);
        switch(op)
        {
            case 1:
            {
                system("clear");
                printf("\nEnter the element : ");
                scanf(" %c",&num);
                insert(num,&head);
                break;
            }
            case 2:
            {
                system("clear");
                if(count == 0)
                printf("\nEmpty tree\n");
                else
                {
                    printf("Display in order..\n");
                    display(head);
                }
                break;
            }
            default: exit(0);
        }
    }
    return 0;
}

我正在使用Geany文本编辑器和Linux Mint。我遇到了一个问题,在编译器中,当我点击display函数时,只会无限地打印我输入的最后一个字符。任何帮助都会很有帮助!谢了!

共有1个答案

孙嘉
2023-03-14

您的显示功能错误。循环条件从不计算为false:

while(&(*head)->lokid!=NULL && &(*head)->hikid!=NULL)

这不是你想要的。&(*head)->lokid&(*head)->hikid都不会计算为null。如果head不是null,那么&(*head)->lokid只是与*head结构tstree中加上lokid的偏移量相同的地址。请注意,您的循环甚至没有可能使条件为false的update语句,也没有任何break-这是注定要失败的。

事实上,你甚至根本不需要循环。要按顺序打印,您只需要以下内容:

void display(node *head) {
    if (head) {
        display(head->lokid);
        printf("%c ", head->letter);
        display(head->hikid);
    }
}

请注意,传递节点**没有任何意义(我将其更改为节点*),返回值应该是void

更新

temp = *head = malloc(sizeof(node));
display(head);

调用INSERT时也会发生同样的情况。您不希望从上次添加的节点开始插入新字母,而是希望从根节点开始添加新字母。main()应该具有以下内容:

insert(num, &head);

同时,请注意temp是完全不必要的。你不需要。insert通过引用操作全局head,temp在这里没有用处(实际上它引入了bug)。

在main中改变这两行就足够了,在这里测试一下,它像一个魅力一样工作。

 类似资料:
  • 我想实现一种将排序数组插入二叉搜索树的算法,但我不希望最终得到一棵只向一侧生长的树。 你有什么想法吗? 谢谢你。

  • 一个痛苦而愚蠢的问题,我几乎羞于不敢问。在过去的4个小时里,我一直在寻找,测试了不同的算法,在纸上尝试了不少,但仍然无法正常工作。 我将为您提供项目实现的详细信息,但基本问题是:“如何处理在预排序二叉树中插入节点。 通过预排序BST,我的意思是所有节点都应该以这样的方式插入,即使用预排序遍历(例如用于打印)遍历树时,应该按升序打印节点。 我只需要一个简单的算法。我尝试了这里给出的一个简单的插入算法

  • 问题内容: 我在将这两种算法结合在一起时遇到麻烦。我被要求修改以返回将元素插入数组的索引。然后有人要求我实现一个使用my 对随机生成的数组进行排序的。 我按照预期的方式工作,每当我单独测试它时都返回正确的索引。我写信是为了了解它是如何工作的,并使其也能工作。一旦将两者结合在一起,它就会崩溃。我知道我在一起实施起来不正确,但是我不确定问题出在哪里。 这是我得到的: 我在运行它时得到的返回值是。有什么

  • 给定二叉查找树(BST)和整数val的根。 在BST中找到该节点的值等于val的节点,并返回以该节点为根的子树。如果这样的节点不存在,则返回null。 为什么'ans=root'不起作用??

  • 问题内容: 我在Binary Search Tree上做了一个小型的Java工作,但是当我实现将节点的递归插入树中并显示它时,我什么也没得到。我已经花了一段时间了,我不确定,但是我认为这是通过引用的问题。 这是我的代码: 我执行了一系列insertR,其根是要插入的节点,而elem是一个字符串,但是它不会打印出任何内容,就好像根本没有填充树一样。我确定我的递归插入有问题,但是我不确定在哪里,我需要

  • 二进制搜索是一种快速搜索算法,运行时复杂度为Ο(log n)。 这种搜索算法的工作原则是分而治之。 为使此算法正常工作,数据收集应采用排序形式。 二进制搜索通过比较集合的最中间项来查找特定项。 如果匹配发生,则返回项目的索引。 如果中间项大于项,则在中间项左侧的子阵列中搜索项。 否则,在中间项右侧的子阵列中搜索项。 该过程也在子阵列上继续,直到子阵列的大小减小到零。 二进制搜索如何工作? 要使二进