Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >用C语言搜索BST元素函数

用C语言搜索BST元素函数
EN

Stack Overflow用户
提问于 2018-10-16 05:30:50
回答 2查看 62关注 0票数 1

我想这一定是个简单的问题,但我不知道出了什么问题。

gdb说

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Program received signal SIGSEGV, Segmentation fault.
0x000055555555543e in searchNode (root=0x0, X=1) at problem1.c:40
40      while(cursor->value != X || cursor != NULL)

插入和搜索函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
typedef struct TreeNode
{
    int value;
    struct TreeNode *left;
    struct TreeNode *right;
    struct TreeNode *parent;
}   tree;

tree *insert(tree *root, int X)
{
    tree *cursor = root;
    tree *parent;

    while(cursor != NULL)
    {
        parent = cursor;
        if(X >= cursor->value)
            cursor = cursor->right;
        else
            cursor = cursor->left;
    }
    cursor = (tree *)malloc(sizeof(tree));
    cursor->value = X;
    cursor->left = cursor->right = NULL;
    cursor->parent = parent;
        return cursor;  
}

tree *searchNode(tree *root, int X)
{
    tree *cursor = root;

    while(cursor->value != X || cursor != NULL)
    {
        if(X >= cursor->value)
            cursor = cursor->right;
        else
            cursor = cursor->left;
    }

    if(cursor == NULL)
        return NULL;

    else if(cursor->value == X)
        return cursor;
}

主要功能

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int main()
{
    tree *root = (tree *)malloc(sizeof(tree));
    root = NULL;

    insert(root, 10);
    insert(root ,20);
    insert(root, 5);
    insert(root, 1);
    insert(root, 15);
    insert(root, 20);
    insert(root, 30);
    insert(root, 100);
    insert(root, 40);
    insert(root, 50);

    node = searchNode(root, 1);
}

据我所知,当我引用空指针时,切分错误大多会出现,但我不认为搜索函数是错误的。我想我在插入函数或初始化树根时出错了,但我不知道出了什么问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-16 05:39:27

出于好奇,我查了一下密码。

我不认为搜索功能是错误的

我不这样认为!

请看这一行代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
while(cursor->value != X || cursor != NULL)

如果cursorNULL,会发生什么?访问cursor->value,即Undefined Behavior (因为不允许访问NULL )。这值得一次Segmentation fault

最好是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
while (cursor != NULL && cursor->value != X)

或更短:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
while (cursor && cursor->value != X)

从gdb中回忆OP的片段

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Program received signal SIGSEGV, Segmentation fault.
0x000055555555543e in searchNode (root=0x0, X=1) at problem1.c:40
40      while(cursor->value != X || cursor != NULL)

(乍一看我没有意识到)这听起来很合理。

根据(root = 0x0),searchNode()似乎被称为空树(rootNULL)。因此,tree *cursor = root;使用一个NULL指针(以及上面的其他指针)初始化cursor

票数 1
EN

Stack Overflow用户

发布于 2018-10-16 06:26:47

insert函数的问题在于它无法更新root的值。返回新的叶节点,但这对跟踪root可能没有多大用处。

要更改root,必须传入指向它的指针,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
insert(&root, 10);

然后你可以像这样改变你的功能。它沿着树遍历,传入指向当前节点的左或右分支的指针,直到它发现该节点还不存在,然后创建它。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tree *insert(tree **root, int X)
{
    if(*root == NULL)
    {
        *root = (tree *)malloc(sizeof(tree));
        (*root)->value = X;
        (*root)->left = (*root)->right = (*root)->parent = NULL;
        return(*root);
    }
    else
    {
        tree *ret;
        if(X >= (*root)->value)
        {
            ret=insert(&(*root)->right, X);
            (*root)->right->parent=*root;
        }
        else
        {
            ret=insert(&(*root)->left, X);
            (*root)->left->parent=*root;
        }
        return ret;
    }
}

因此,当您第一次调用它时,它将为您填充root。第二次,它将传入指向root->right的指针,这将成为insert函数中的新root,因为它是NULL,因此将创建它。然后为了完整起见,它更新了parent链接。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52836635

复制
相关文章
Leetcode|BST属性|700. BST搜索
注意 格式最好写成if..else if而不是if...if if (val < root->val) {...} else if (val > root->val) {...} 否则,容易将上一个if改变后的root代入到下一个if中 if (val < root->val) {...} if (val > root->val) {...} 1 DFS /** * Definition for a binary tree node. * struct TreeNode { * int v
SL_World
2021/09/18
2790
用匿名函数定义函数_c语言最先执行的函数是
关于函数声明,它最重要的一个特征就是函数声明提升,意思是执行代码之前先读取函数声明。这意味着可以把函数声明放在调用它的语句之后。如下代码可以正确执行:
全栈程序员站长
2022/08/04
1K0
【说站】c语言中fread函数怎么用
2、fread函数不区分文件的尾部和错误,因此调用者必须使用feof和ferror来判断发生了什么。
很酷的站长
2022/11/24
1.6K0
【说站】c语言中fread函数怎么用
c语言从数组中删除指定元素_c语言数组添加元素
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/169514.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/22
5.9K0
c语言从数组中删除指定元素_c语言数组添加元素
C语言strstr函数_c语言fwrite函数的用法
函数名: strstr 功 能: 在串中查找指定字符串的第一次出现 用 法: char *strstr(char *str1, char *str2); 程序例:
全栈程序员站长
2022/11/03
5.9K0
C语言strstr函数_strstr函数c语言实现
查找字符串的函数,语法规则char *strstr( const char *string, const char *strCharSet )用于查找字符串strCharSet是否为字符串string的子字符串,需要引用头文件#include <string.h>
全栈程序员站长
2022/11/04
5.7K0
C语言strstr函数_strstr函数c语言实现
C语言fread函数_C语言fread
The prototype of the function fread() is:
全栈程序员站长
2022/10/02
23.2K0
C语言fread函数_C语言fread
strcmp函数的使用_用c语言实现strcmp
* fuc:我输入一个网址,网址中包含若干参数(ID、password),网址提交后IE返回登录结果(A\X\Z\D);返回A代表登录成功,返回X代表登录失败,返回Z和D是其他情况;
全栈程序员站长
2022/09/20
7910
c语言fread函数的功能_c语言sizeof函数用法
C语言中:fread是一个函数。从一个文件流中读数据,最多读取count个元素,每个元素size字节,如果调用成功返回实际读取到的元素个数,如果不成功或读到文件末尾返回 0。下面我们来看看c语言fread函数的用法。
全栈程序员站长
2022/09/30
4.6K0
二叉搜索树(BST)- HDU 3791
二叉查找树(英语:Binary Search Tree),也称二叉搜索树、有序二叉树(英语:ordered binary tree),排序二叉树(英语:sorted binary tree),是指一棵空树或者具有下列性质的二叉树:
ACM算法日常
2018/08/07
8120
C语言函数pow(c语言pow函数头文件)
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/128228.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/26
4.4K0
C语言函数pow(c语言pow函数头文件)
用c语言做简单动画_用C语言编写动画
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
全栈程序员站长
2022/09/22
5.4K0
c语言中system函数怎么用_system函数的返回值
c语言中的system()函数主要用于发出一个DOS命令,该函数已经收录在标准c库中,可以直接调用。使用时包含头文件<stdlib.h>
全栈程序员站长
2022/09/29
2.4K0
c语言中system函数怎么用_system函数的返回值
C语言练习之用函数完成数组元素的逆置
设置left为左下标,right为右下标,temp为交换两个数内容的中间变量 先将下标为left的值赋值给temp,再将下标为right的值赋值给下标为元素left,最后再将temp的值赋值给下标为left的元素 再对left++,同时对right--,一直循环到left>right
摘星
2023/04/28
5690
C语言练习之用函数完成数组元素的逆置
C语言函数递归_c语言递归举例
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说C语言函数递归_c语言递归举例,希望能够帮助大家进步!!!
Java架构师必看
2022/07/19
13.7K0
C语言函数递归_c语言递归举例
C语言return函数
说到return,有必要提及主函数的定义。很多人甚至市面上的一些书籍,都使用了void main( )这一形式 ,其实这是错误的。
Java架构师必看
2021/03/22
3.2K0
C语言 | scanf函数
“要成为绝世高手,并非一朝一夕,除非是天生武学奇才,但是这种人…万中无一” ——包租婆
小林C语言
2021/03/23
3.7K0
C语言_函数【转】
引用地址:http://baike.baidu.com/link?url=U9h6MccLYX2w5uyVOqIFd3eps5gR2FZA10jYRLRnc66Ff_F5ZrmXGKA12DT-_2x
landv
2018/05/24
4.7K0
c语言比较函数
strcmp()函数: #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> void test() { //
大忽悠爱学习
2021/03/02
2.9K0
c语言比较函数
C语言初阶——函数
  假设x=5,请问y等于多少?不知道大家是否还对数学中的函数有印象,x、y、z在几个字母的出现率不亚于英语作为中的李华,而在我们C语言中的函数与数学中的函数不太一样。维基百科给出的定义是:子程序(function),是一个大型程序中的某部分代码,由一个或多个语句块组成。函数部分代码负责完成某项特定任务,而且相对于其他代码比较独立。C语言中的函数是由函数返回值类型、函数名和函数参数组成,三者相辅相成,是完成任务的关键。 
北 海
2023/07/01
1860
C语言初阶——函数

相似问题

用C语言编写BST程序

20

C语言中BST的链表:广度优先搜索

10

C中BST中的搜索函数

20

用C将元素插入到BST中

10

BST golang搜索函数

255
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文