C语言实现BST二叉排序树的基本操作

C语言实现BST二叉排序树的基本操作,可以分为创建、插入、删除、查找、遍历等几个步骤。

创建二叉排序树

创建一个二叉排序树的过程,就是创建BSTNode结构体实例的过程。BSTNode结构体定义如下:

typedef struct BSTNode
{
    int data;        // 数据域
    struct BSTNode *left;   // 左孩子指针
    struct BSTNode *right;  // 右孩子指针
}BSTNode, *BSTree;

这里定义了一个BSTree类型,表示指向BSTNode结构体的指针。

创建二叉排序树的步骤如下:

  1. 初始化BSTree为NULL,表示空树。
  2. 循环读入数据,每读入一个数据,就将其插入二叉排序树中。

示例代码如下:

BSTree create_bst()
{
    BSTree root = NULL; // 根节点初始化为空

    printf("请输入节点数据,结束标志为-1:\n");
    int val;
    scanf("%d", &val);

    while(val != -1)
    {
        root = insert_bst(root, val);
        scanf("%d", &val);
    }

    return root;
}

插入节点

插入节点操作是指将一个新的节点插入到二叉排序树中,使得插入后仍然保持有序性质的操作。

插入节点的步骤如下:

  1. 如果树为空,则创建一个新结点作为根节点。
  2. 如果树不为空,则从根节点开始,递归查找插入位置。
  3. 如果需要插入的值小于当前结点,则在左子树中递归查找插入位置。
  4. 如果需要插入的值大于当前结点,则在右子树中递归查找插入位置。
  5. 如果需要插入的值与当前结点的值相等,则不进行插入操作。

示例代码如下:

BSTree insert_bst(BSTree root, int val)
{
    if(root == NULL)
    {
        root = (BSTree)malloc(sizeof(BSTNode));
        root->data = val;
        root->left = NULL;
        root->right = NULL;
    }
    else if(val < root->data)
    {
        root->left = insert_bst(root->left, val);
    }
    else if(val > root->data)
    {
        root->right = insert_bst(root->right, val);
    }

    return root;
}

删除节点

删除节点操作是指从二叉排序树中删除一个指定的节点的操作。

删除节点的步骤如下:

  1. 查找需要删除的节点。
  2. 如果需要删除的节点没有左右子树,则直接删除。
  3. 如果需要删除的节点只有左子树或右子树,则用其左子树或右子树代替它本身。
  4. 如果需要删除的节点既有左子树又有右子树,则用其左子树最大节点或右子树最小节点代替它本身。

示例代码如下:

BSTree delete_bst(BSTree root, int val)
{
    if(root == NULL)    // 树为空,找不到要删除的节点
    {
        return NULL;
    }
    else if(val < root->data)   // 要删除的节点在左子树中,递归删除
    {
        root->left = delete_bst(root->left, val);
    }
    else if(val > root->data)   // 要删除的节点在右子树中,递归删除
    {
        root->right = delete_bst(root->right, val);
    }
    else    // 找到要删除的节点
    {
        if(root->left == NULL && root->right == NULL)   // 情况1:没有左右子树
        {
            free(root);
            root = NULL;
        }
        else if(root->left == NULL)    // 情况2:只有右子树
        {
            BSTree temp = root;
            root = root->right;
            free(temp);
        }
        else if(root->right == NULL)   // 情况2:只有左子树
        {
            BSTree temp = root;
            root = root->left;
            free(temp);
        }
        else    // 情况3:左右子树都有
        {
            BSTree temp = find_max(root->left);   // 从左子树中找到最大值
            root->data = temp->data;   // 用最大值代替要删除的节点
            root->left = delete_bst(root->left, temp->data);  // 删除左子树中的最大值所在节点
        }
    }

    return root;
}

// 在BSTree中查找最大值节点
BSTree find_max(BSTree root)
{
    if(root == NULL)
    {
        return NULL;
    }
    else if(root->right == NULL)
    {
        return root;
    }
    else
    {
        return find_max(root->right);
    }
}

查找节点

查找节点操作是指在二叉排序树中查找一个指定的节点的操作,返回节点的位置或NULL。

查找节点的步骤如下:

  1. 从根节点开始,如果当前节点为空,则返回NULL表示未找到。
  2. 如果当前节点的值等于要查找的值,则返回该节点。
  3. 如果当前节点的值大于要查找的值,则在左子树中递归查找。
  4. 如果当前节点的值小于要查找的值,则在右子树中递归查找。

示例代码如下:

BSTree search_bst(BSTree root, int val)
{
    if(root == NULL)    // 未找到
    {
        return NULL;
    }
    else if(root->data == val)  // 找到了
    {
        return root;
    }
    else if(root->data > val)   // 在左子树中查找
    {
        return search_bst(root->left, val);
    }
    else    // 在右子树中查找
    {
        return search_bst(root->right, val);
    }
}

遍历二叉排序树

遍历二叉排序树的过程,主要有三种方式,分别是前序遍历、中序遍历、后序遍历。

前序遍历

前序遍历的步骤如下:

  1. 访问当前节点。
  2. 遍历左子树。
  3. 遍历右子树。

示例代码如下:

void pre_order(BSTree root)
{
    if(root != NULL)
    {
        printf("%d ", root->data);
        pre_order(root->left);
        pre_order(root->right);
    }
}

中序遍历

中序遍历的步骤如下:

  1. 遍历左子树。
  2. 访问当前节点。
  3. 遍历右子树。

示例代码如下:

void in_order(BSTree root)
{
    if(root != NULL)
    {
        in_order(root->left);
        printf("%d ", root->data);
        in_order(root->right);
    }
}

后序遍历

后序遍历的步骤如下:

  1. 遍历左子树。
  2. 遍历右子树。
  3. 访问当前节点。

示例代码如下:

void post_order(BSTree root)
{
    if(root != NULL)
    {
        post_order(root->left);
        post_order(root->right);
        printf("%d ", root->data);
    }
}

以上就是C语言实现BST二叉排序树的基本操作的完整攻略,并提供了相应示例代码。

阅读剩余 82%

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言实现BST二叉排序树的基本操作 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • spanwidth无效

    以下是“spanwidth无效”的完整攻略: spanwidth无效 在HTML和CSS中,spanwidth是一种用于设置表格单元格宽度的属性。但是某些情况下,spanwidth可能会无效。本攻略将介绍spanwidth无效的原因和解决方法。 spanwidth无效的因 spanwidth无效的原因可能有以下几种: 单元格中的内容过宽:如果单元格中的内容过…

    other 2023年5月7日
    00
  • 全能vip音乐在线解析

    全能VIP音乐在线解析 作为音乐爱好者,相信大家都遇到过这样的情况,想要下载一首自己喜欢的歌曲,却发现下载链接失效或是需要付费才能下载,这时候我们就需要一个好用的音乐在线解析工具。 全能VIP音乐在线解析是一个强大的在线工具,可以解析各大音乐平台的VIP歌曲,让你轻松听到高品质的音乐。以下是该工具的使用方法: 步骤一:找到要解析的VIP链接 首先,我们需要找…

    其他 2023年3月28日
    00
  • “内存不足”问题的处理办法

    处理“内存不足”问题的完整攻略 1. 了解“内存不足”问题的原因 在处理“内存不足”问题之前,首先需要了解造成该问题的原因。常见的原因包括:- 运行过多的程序或进程,消耗了系统的内存资源。- 单个程序或进程占用了过多的内存。- 内存泄漏,导致内存资源无法释放。 2. 监控内存使用情况 在处理“内存不足”问题之前,需要先了解当前系统的内存使用情况。可以通过以下…

    other 2023年7月31日
    00
  • C语言编程C++自定义个性化类型

    我可以提供一份“C语言编程C++自定义个性化类型”的攻略: 简介 C++是C语言的一个扩展和升级版,支持面向对象编程,具有更多的语言特性和功能。自定义类型是C++的重要特性,它允许我们创建自己的数据类型和对象。本文将详细讲解如何使用C++来定义个性化类型。 定义结构体 在C++中,可以使用结构体来定义新的类型。结构体是由一些变量和函数组成的用户自定义类型。 …

    other 2023年6月25日
    00
  • 中文用户名的js检验正则

    以下是详细的中文用户名的js检验正则的攻略: 1. 确定用户名要求 在正则表达式编写之前,首先需要确定中文用户名的具体要求。一般而言,中文用户名要求如下: 由中文字符组成(包括中文字符、汉字、繁体字等) 长度为2到15个字符之间 可以包含数字、字母或下划线,但不能以这些字符开头或结尾 2. 编写正则表达式 根据上述要求,可以编写出如下正则表达式: /^[\u…

    other 2023年6月27日
    00
  • 火影忍者OL高手须知的火影冷知识科普

    火影忍者OL高手须知的火影冷知识科普攻略 一、介绍 在火影忍者OL中,了解一些冷知识可以帮助高手更好地了解游戏世界、提高游戏能力。本攻略将为您介绍一些火影忍者OL的冷知识,并为您提供示例说明。 二、火影忍者OL的冷知识 隐藏任务 火影忍者OL中有一些隐藏任务,它们通常不在任务列表中显示,需要玩家发现和触发。完成隐藏任务可以获得丰厚的奖励或者开启新的功能。 示…

    other 2023年6月28日
    00
  • IE11 For Win7、win2008中文版官方下载地址

    IE11 For Win7、Win2008中文版官方下载地址攻略 1. 访问微软官方网站 首先,你需要访问微软官方网站以获取IE11的下载地址。你可以通过以下步骤完成: 打开你的浏览器,输入微软官方网站的URL:https://www.microsoft.com/zh-cn/ 在微软官方网站的首页,你可以看到一个搜索框。在搜索框中输入\”IE11下载\”或者…

    other 2023年8月4日
    00
  • Python常用的文件及文件路径、目录操作方法汇总介绍

    下面是Python常用的文件及文件路径、目录操作方法汇总介绍的详细攻略。 文件操作方法 打开/关闭文件 在Python中,使用内置的open()函数打开文件。open()函数接受两个参数:文件名和以何种方式打开文件。文件名可以是绝对路径或相对路径。方式有“r”(读取)、“w”(写入)和“a”(追加)等。 # 打开一个文件 f = open("dem…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部