文章目录

  • 概述
  • 待删除的结点没有子树
  • 待删除的结点仅有一颗子树
  • 待删除的结点有两颗子树
  • C代码实现

概述

这是一篇短文,专门考究一下二叉搜索树的删除。

二叉搜索树的建立非常简单,如果不熟悉的见此文 树与二叉树。

而删除则有数种情况:

  1. 待删除的结点没有子树。
  2. 待删除的结点仅有一颗子树。
  3. 待删除的结点有两颗子树。

下面逐一分析。

待删除的结点没有子树

如需删除下图中结点9:

这是最简单的一种情况,它没有子树,意味着没有太多需要特殊处理的地方,只需要简单的将其从其父亲处删除即可。即移除结点8的右子树,移除后如下图:

待删除的结点仅有一颗子树

如需删除下图中结点8:

仅有一颗子树的情况其实也非常简单,只需要将其唯一的子树接到其原父亲结点处,即原本指向被删除结点的指针改为指向被删除结点的子树。移除后如下图:

待删除的结点有两颗子树

如需删除下图中结点3:

这种情况就有些特殊了,如果要保证删除后二叉搜索树的相对位置不变(即中序遍历顺序不变),那有两种方法:

  1. 使待删除结点的左子树代替被删除的结点,将被删除结点的右子树放置于被删除结点的左子树的最右边。
  2. 用待删除结点的直接前驱或直接后继(指的是遍历顺序的)代替被删除的结点,然后再删除用以替代的原节点。

下面主要说明第一种方法,删除后即如下:

可以看到,删除前中序遍历结果为:1345689,而删除后中序遍历结果为:145689,即元素间的顺序没有被改变。

如果删除的是根结点,情况也是一样的:

它的中序遍历1345689->134689也没有发生变化。

C代码实现

int BT_delete(BTree * t, int dat)
{if (t == NULL || t->cnt == 0)return 0;BTreeNode **pointToCur = &t->root; //因为结点删除实际上是让原本指向该结点的指针指向别的结点,为了方便修改使用一个指向树结点指针的指针。BTreeNode *pcur = t->root;BTreeNode *pdelete;while (pcur != NULL && pcur->data != dat) //查找树是否存在待删除元素{if (dat <= pcur->data){pointToCur = &pcur->left;pcur = pcur->left;}else{pointToCur = &pcur->right;pcur = pcur->right;}}if (pcur == NULL) //未找到元素return 0;pdelete = pcur;if (pcur->left == NULL && pcur->right == NULL)*pointToCur = NULL;else if (pcur->left == NULL)*pointToCur = pcur->right;else if (pcur->right == NULL)*pointToCur = pcur->left;else{*pointToCur = pcur->left; //用被删除结点的左子树替换被删除的结点pcur = pdelete->left; //转至被删除结点左子树while (pcur->right != NULL) pcur = pcur->right; //递进至最右pcur->right = pdelete->right; //将被删除结点的右子树结于被删除结点的左子树最右边。}free(pdelete);t->cnt--;return 1;
}

数据结构 二叉搜索树的删除相关推荐

  1. 08_Python算法+数据结构笔记-二叉搜索树查询/删除-AVL树旋转/插入/应用-贪心算法

    b站视频:路飞IT学城 清华计算机博士带你学习Python算法+数据结构_哔哩哔哩_bilibili #71 二叉搜索树:查询 import randomclass BiTreeNode:def __ ...

  2. 数据结构---二叉搜索树

    数据结构-二叉搜索树 原理:参考趣学数据结构 代码: 队列代码: #pragma once #define N 100 #define elemType bstTree* #include<st ...

  3. Python实现二叉搜索树的删除功能

    Python实现二叉搜索树的删除功能 二叉搜索树(二叉查找树,Binary Search Tree)又称为排序二叉树.有序二叉树. 二叉搜索树的实现可以参考:https://blog.csdn.net ...

  4. 二叉搜索树的删除操作可以交换吗_JavaScript数据结构 — 二叉搜索树(BST)ES6实现...

    1. 概述 最基本的数据结构是向量和链表,为了将二者的优势结合起来,我们引入了二叉树,可以认为二叉树是列表在维度上的拓展.而今天要介绍的二叉搜索树(BST)则是在形式上借鉴了二叉树,同时也巧妙借鉴了有 ...

  5. 二叉搜索树的删除操作可以交换吗_一文看懂数据结构中的树

    通常在开始学编程的时候,你会接触一些常用数据结构.到最后一般会学到哈希表.对于修读计算机科学学位的朋友,你通常要上专门的数据结构课,从了解有关链表.队列和栈的各种知识.这些统称为线性数据结构,因为依逻 ...

  6. 数据结构 二叉搜索树BST的实现与应用

    概念 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 1.若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值 ...

  7. 二叉搜索树的删除_LeetCode109.有序链表转换二叉搜索树

    点击上方"蓝字",发现更多精彩. 01PART二叉搜索树二叉查找树又称二叉搜索树或者二叉排序树:它可以是一个空树或者是一个二叉树,既有链表的快速插入与删除的特点,又有数组快速查找的 ...

  8. 数据结构——二叉搜索树

    一.定义 二叉搜索树(binary search tree),又叫二叉查找树.二叉排序树.若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的右子树不空,则右子树上所有结点的值均大于 ...

  9. 数据结构——二叉搜索树的C语言实现

    1.什么是二叉搜索树? 2.二叉搜索树的操作 3.二叉搜索树的C语言实现 #include<stdio.h> #include<stdlib.h>#define Element ...

最新文章

  1. 10分钟理解CSS3 FlexBox
  2. 一个老忘且非常有用的jquery动画方法 网页上卷
  3. RabbitMQ和Kafka
  4. .NET Core 微服务学习与实践系列文章目录索引(2019版)
  5. libhiredis.so.0.13: cannot open shared object file: No such file or directory in Unknown on line
  6. 解决pytorch DataLoader 加载数据报错UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xe5 in position 1023
  7. 3个月贵了1.6万!特斯拉Model 3今年已涨价6次
  8. Java基础语法之变量作用域、小大驼峰命名规则和java运算符(赋值、关系、三元、逻辑运算符)
  9. JAVA基础知识(13)-----Lock接口
  10. 修改MYSQL数据库表的字符集
  11. 关注手机病毒:重点手机安全事件盘点
  12. 西工大计算机专业研究生就业前景,2020考研34所院校就业情况解读:西北工业大学...
  13. 四、字符串(7):重复的子字符串
  14. uniapp,小程序,实现签名功能
  15. 历年奥斯卡获奖影片(1927—2014)
  16. 在家远程控制公司电脑 掌握这两种方法你就超神了
  17. Linux 命令(159)—— hostname 命令
  18. git+vimdiff 一次关闭所有文件
  19. 教你用 Python 快速批量转换 HEIC 文件
  20. 华为防火墙做单臂路由_华为单臂路由配置实例

热门文章

  1. 跟我一起做京东金融的项目白条页(四)
  2. 微信小程序流量主开通 如何赚钱
  3. c语言5基础教程,[简001]《极简C语言入门教程》共5章
  4. centos8 ssh链接不上之防火墙端口未开放
  5. 数组——排序(起泡法)
  6. 美国公司是如何搞创新的,又是如何失败的......
  7. 子网掩码必须是相邻的是什么意思_子网掩码必须是相邻的是什么意思 您输入一个无效的子网掩码...
  8. hacker.pcapng解析
  9. 用超多实例,解析「交互设计七大定律」在设计中的应用(上篇)
  10. 解密:马云为何对肯德基“下手”?