数据结构和算法学习记录——二叉搜索树的插入操作、删除操作

简介: 数据结构和算法学习记录——二叉搜索树的插入操作、删除操作

二叉搜索树的插入

要进行二叉搜索树的插入,

关键点在于要找到元素应该插入到哪个位置,可以采用与Find类似的方法,

将要插入的节点与根节点进行比较,如果大于根节点,就往右边走;

若小于根节点,就往左边走;

直到某一个节点的左子树或者右子树为空就停止,进行节点的插入操作。

思路图解

代码实现

BinTree Insert(ElementType x, BinTree BST)
{
  if (!BST)    //若树为空,则创建并返回一个节点的二叉搜索树
  {
    BST = malloc(sizeof(struct TreeNode));
    BST->data = x;
    BST->Left = BST->Right = NULL;
  }
  else if (x > BST->data)     //开始查找要插入元素的位置
  {
    BST->Right = Insert(x, BST->Right);   //递归进入右子树
  }
  else if (x < BST->data)
  {
    BST->Left = Insert(x, BST->Left);    //递归进入左子树
  }
  //else
  //{
  //  //x匹配成功,则说明都不做
  //}
  return BST;
}

要点

需要注意的是:

当找到了新节点应该插入的位置时,需要通过找到上一个节点的地址,来将上一个节点的左子树指针或者右子树指针指向新节点。

例如:

例题

以一年十二个月的英文缩写为键值,按从一月到十二月的顺序输入

即输入序列为:

Jan、Feb、Mar、Apr、May、Jun、July、Aug、Sept、Oct、Nov、Dec。

它形成的二叉搜索树是怎样的呢?

这里月份缩写键值的比较,按照的是字母在字典中的排序大小,如A最小,Z最大。如果第一个字母相同,则继续比较第二个字母。

形成的二叉搜索树就为:

二叉搜索树的删除

二叉搜索树的删除需要考虑三种情况:

情况一

1.要删除的节点是叶节点:

那么就可以直接删除,并再修改该节点的父节点指针——置为空。

例:

情况二

2.要删除的节点只有一个孩子节点:

那么就将该节点的父节点的指针指向要删除节点的孩子节点。

例:

情况三

3.要删除的节点有左、右两颗子树:

这种情况是比较复杂的,我们把复杂的问题问题转换为简单的问题。

我们已经知道了没有孩子节点的情况和只有一个孩子节点的情况该怎么删除了,当有两个孩子节点的情况时,就考虑能不能把它变成只有一个孩子节点的情况来处理呢?

是可以实现的:用另一节点替代被删除的节点,这个节点应是右子树的最小元素或者左子树的最大元素。

例:

右子树的最小元素

左子树的最大元素

所以删除节点有两个孩子节点的情况下,我们就变成了在右子树找最小元素或者在左子树找最大元素的问题了。这样处理的好处是:左子树的最大值一定不是有两个孩子节点的情况、而右子树的最小值也一定不是有两个孩子节点的情况。

代码实现

BinTree Delete(ElementType x, BinTree BST)
{
  Position Tmp;
  if (!BST)
  {
    printf("要删除的元素未找到\n");
  }
  else if (x < BST->data)
  {
    BST->Left = Delete(x, BST->Left);  //查找节点,往左子树递归
  }
  else if (x > BST->data)
  {
    BST->Right = Delete(x, BST->Right);//查找节点,往右子树递归
  }
  else                                   //找到了要删除的节点
  {
    if (BST->Left && BST->Right)     //被删除的节点有左右两个孩子节点
    {
      Tmp = FindMin(BST->Right);   //在右子树中找到最小元素
      BST->data = Tmp->data;       //将最小元素填充到要删除的节点位置
      BST->Right = Delete(BST->data, BST->Right);
      //在要删除节点的右子树里删除那个最小元素
    }
    else                             //被删除的节点只有一个孩子节点或者没有孩子节点
    {
      Tmp = BST;
      if (!BST->Left)              //有右孩子节点或者没有孩子节点
      {
        BST = BST->Right;
      }
      else if (!BST->Right)        //有左孩子节点或者没有孩子节点
      {
        BST = BST->Left;
      }
      free(Tmp);
    }
  }
  return BST;
}

end



目录
相关文章
|
9天前
|
机器学习/深度学习 存储 算法
解锁文件共享软件背后基于 Python 的二叉搜索树算法密码
文件共享软件在数字化时代扮演着连接全球用户、促进知识与数据交流的重要角色。二叉搜索树作为一种高效的数据结构,通过有序存储和快速检索文件,极大提升了文件共享平台的性能。它依据文件名或时间戳等关键属性排序,支持高效插入、删除和查找操作,显著优化用户体验。本文还展示了用Python实现的简单二叉搜索树代码,帮助理解其工作原理,并展望了该算法在分布式计算和机器学习领域的未来应用前景。
|
3月前
|
算法 数据处理 C语言
C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合
本文深入解析了C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合,旨在帮助读者掌握这一高效的数据处理方法。
91 1
|
14天前
|
存储 机器学习/深度学习 算法
C 408—《数据结构》算法题基础篇—链表(下)
408考研——《数据结构》算法题基础篇之链表(下)。
76 29
|
14天前
|
存储 算法 C语言
C 408—《数据结构》算法题基础篇—链表(上)
408考研——《数据结构》算法题基础篇之链表(上)。
72 25
|
11天前
|
存储 算法 Java
解锁“分享文件”高效密码:探秘 Java 二叉搜索树算法
在信息爆炸的时代,文件分享至关重要。二叉搜索树(BST)以其高效的查找性能,为文件分享优化提供了新路径。本文聚焦Java环境下BST的应用,介绍其基础结构、实现示例及进阶优化。BST通过有序节点快速定位文件,结合自平衡树、多线程和权限管理,大幅提升文件分享效率与安全性。代码示例展示了文件插入与查找的基本操作,适用于大规模并发场景,确保分享过程流畅高效。掌握BST算法,助力文件分享创新发展。
|
14天前
|
存储 人工智能 算法
C 408—《数据结构》算法题基础篇—数组(通俗易懂)
408考研——《数据结构》算法题基础篇之数组。(408算法题的入门)
58 23
|
1月前
|
负载均衡 算法
架构学习:7种负载均衡算法策略
四层负载均衡包括数据链路层、网络层和应用层负载均衡。数据链路层通过修改MAC地址转发帧;网络层通过改变IP地址实现数据包转发;应用层有多种策略,如轮循、权重轮循、随机、权重随机、一致性哈希、响应速度和最少连接数均衡,确保请求合理分配到服务器,提升性能与稳定性。
228 11
架构学习:7种负载均衡算法策略
|
26天前
|
存储 算法 安全
U 盘管控情境下 Python 二叉搜索树算法的深度剖析与探究
在信息技术高度发达的今天,数据安全至关重要。U盘作为常用的数据存储与传输工具,其管控尤为关键。本文探讨Python中的二叉搜索树算法在U盘管控中的应用,通过高效管理授权U盘信息,防止数据泄露,保障信息安全。二叉搜索树具有快速插入和查找的优势,适用于大量授权U盘的管理。尽管存在一些局限性,如树结构退化问题,但通过优化和改进,如采用自平衡树,可以有效提升U盘管控系统的性能和安全性。
25 3
|
1月前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
49 2
|
2月前
|
存储 运维 监控
探索局域网电脑监控软件:Python算法与数据结构的巧妙结合
在数字化时代,局域网电脑监控软件成为企业管理和IT运维的重要工具,确保数据安全和网络稳定。本文探讨其背后的关键技术——Python中的算法与数据结构,如字典用于高效存储设备信息,以及数据收集、异常检测和聚合算法提升监控效率。通过Python代码示例,展示了如何实现基本监控功能,帮助读者理解其工作原理并激发技术兴趣。
68 20