所以我试着做一个三元搜索。现在,我只处理插入函数。我已经理解了三元搜索的基本思想。我知道一个根节点有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函数时,只会无限地打印我输入的最后一个字符。任何帮助都会很有帮助!谢了!
您的显示功能错误。循环条件从不计算为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是一个字符串,但是它不会打印出任何内容,就好像根本没有填充树一样。我确定我的递归插入有问题,但是我不确定在哪里,我需要
我正在尝试实现一个二叉查找树,但是“搜索”函数对于除了根之外的每个条目都返回了错误的值。 该函数应返回其值与键参数匹配的节点的地址,如果节点不存在,则返回 NULL。 当我运行代码时,我得到以下内容: 我知道每个节点的“左”和“右”指针链接正确,因为“delAll”函数成功删除了所有节点。 将“cout”语句添加到“search”函数表明该函数似乎返回了正确的地址。为什么从主主调用时会打印错误的地