二叉搜索树的删除操作详解(BST)

一、思想:分类讨论

二、二叉搜索树的删除操作具体讨论分如下四种情况:(记我们要删除的节点为D)

1、如果D节点既没有左孩子,也没有右孩子,那么直接删除就好了;

2、如果D节点只有左孩子,没有右孩子,那么只需要把该D节点左孩子链接到D节点的父亲节点,然后删除D节点就好了;

3、如果D节点只有右孩子,没有左孩子,那么只需要把该D节点右孩子链接到D节点的父亲节点,然后删除D节点就好了;

4、如果D节点既有左孩子,又有右孩子,那么需要找到D节点的右子树的最小值节点,找到之后直接替换掉D节点,然后删除找到的最小值节点就好了。(解释:因为D节点有左右两个孩子节点,很显然D节点的左子树中的所有节点值都小于D节点的值,D节点的右子树中的所有节点的值都大于D节点的值,这个是根据二叉搜索树的定义得到的结论。那么现在D要被删除,那么D被删除之后谁可以来替换它的位置呢?显然只能是D的右子树的最小值可以胜任,因为它既满足大于D节点的左子树中的所有节点值,因为D的右子树的所有节点值都大于D的左子树的节点值;同时也满足小于D的右子树中所有的其他节点值,因为D是右子树中最小的值,当然小于D的右子树中所有其他节点值了)

三、图例说明:

1、第一种情况:这种情况其实就是叶子节点的删除,反正它绝代了,删除了就删除了,多他不多,少它不少。比如删除下图中的21号元素,它既没有左孩子,也没有右孩子,直接将其父节点指向它的链接删除就行了。

2、第二种情况:删除10号节点,该节点只有左孩子,没有右孩子。只需要三步即可,删除10号节点指向其5号左子树的链接,删除10号节点的父节点15号指向她的链接,将10号节点的父节点15号的左链接指向10号的5号左子树。

3、第三种情况:删除40号节点,该节点只有右孩子,没有左孩子。只需要三步即可,删除40号节点指向其50号右子树的链接,删除40号节点的父节点30号指向她的链接,将40号节点的父节点30号的右链接指向40号的50号右子树。

2、第四种情况:删除20号节点,因为他既有左孩子,又有右孩子。所以先找到20号节点的右子树中所有节点中的最小值为21号,其实右子树的最小值就是在右子树的最左边的那个节点;找到替换节点21号后就可以进行下一步操作了,如下图,20号需的父节点指向的链接改变为指向21号,20的左右孩子链接也需要替换,21号原来的父节点指向需要删除。

原文地址:https://www.cnblogs.com/igoodful/p/8846706.html

时间: 2024-08-04 05:47:01

二叉搜索树的删除操作详解(BST)的相关文章

C++实现二叉搜索树的常用操作

实现操作 (1)二叉搜索树的建立 (2)二叉搜索树的插入 (3)二叉搜索树的三种递归遍历(前序.中序和后续) (4)二叉搜索树的三种非递归遍历(前序.中序和后续) (5)二叉搜索树的逐层打印 (6)搜索某一个字符(递归算法) (7)搜索一个字符(非递归算法) (8)查找最大元素 (9)查找最小元素 有时间再实现: (10)二叉搜索树的前驱和后继查找 (11)二叉搜索树的删除 源码分析: #include <iostream> #include <stack> #include &l

二叉搜索树的删除

-------------------siwuxie095 二叉搜索树的删除 程序: BST.h: #ifndef BST_H #define BST_H #include "stdlib.h" #include <queue> //二叉搜索树 template <typename Key, typename Value> class BST { private: struct Node { Key key; Value value; Node *left; N

红黑树的删除操作详解

注:本文转载自博客园,博主原址:http://www.cnblogs.com/tongy0/p/5460623.html,感谢博主帮我弄清楚了红黑树删除操作,转载做收藏用. 红黑树的删除操作 1:节点命名约定 D表示要被删除的节点.即:取 Delete 的首字母: P 表示父节点.即:取 Parent 的首字母: S表示兄弟姐妹节点.即:取 Sibling的首字母: U表示叔伯节点.即:取Uncle的首字母: G表示祖父节点.即:取 Grandfather的首字母: L表示左树.即:取Left的

二叉搜索树的相关操作

操作包括二叉搜索树的创建,插入,搜索,寻找前驱后继,删除,左右旋转,插入元素为根结点,以及两棵二叉树的合并. 二叉树的创建很简单,只需要设置 value, left child, right child 即可. 插入的时候递归插入树中合适的位置,通过比较插入元素的值与根结点元素的值,如果小于则递归插入到左子树中,否则递归插入到右子树中. 搜索的时候与插入类似,比较要搜索的值和根结点元素值的大小,若小于则递归到左子树中去查找,否则递归到右子树中去查找. 寻找前驱的方式是在左子树的右结点中去递归寻找

二叉搜索树的一些操作的C++实现

头文件: #include<iostream> using namespace std; typedef struct BiTNode { int data; int key; struct BiTNode *parent, *lchild, *rchild; }BiTNode, *BiTree; BiTree Tree_Search(BiTree x, int k); void Tree_Walk(BiTree x); BiTree Tree_Minimun(BiTree x); BiTre

【算法导论学习-24】二叉树专题2:二叉搜索树(Binary Search Tree,BST)

一.   二叉搜索树(Binary SearchTree,BST) 对应<算法导论>第12章.相比一般二叉树,BST满足唯一的条件:任意节点的key>左孩子的key,同时<右孩子的key. 1.     节点类: public class BinarySearchTreesNode<T> { private int key; private T satelliteData; private BinarySearchTreesNode<T> parent, l

【模板】二叉搜索树(二叉排序树,二叉查找树,BST)

二叉搜索树其实就是满足左结点小于根,右结点大于根这类规则的树形结构. 1 int n; 2 int a[MAX_N]; 3 int lt[MAX_N], rt[MAX_N]; 4 // 没有则为-1 5 // 默认a[0]为根结点 6 7 void Insert(int x, int obj) // 插入结点a[obj] 8 { 9 if(a[obj] < a[x]) 10 { 11 if(lt[x] ^ -1) Insert(lt[x], obj); 12 else lt[x] = obj;

LeetCode 783. 二叉搜索树结点最小距离(Minimum Distance Between BST Nodes)

783. 二叉搜索树结点最小距离 LeetCode783. Minimum Distance Between BST Nodes 题目描述 给定一个二叉搜索树的根结点 root, 返回树中任意两节点的差的最小值. 示例: 输入: root = [4,2,6,1,3,null,null] 输出: 1 解释: 注意: root 是树结点对象 (TreeNode object),而不是数组. 给定的树 [4,2,6,1,3,null,null] 可表示为下图: 4 / 2 6 / \ 1 3 最小的差

056:ORM外键删除操作详解

外键删除操作: 如果一个模型使用了外键.那么在对方那个模型被删掉后,该进行什么样的操作.可以通过 on_delete 来指定.可以指定的类型如下:1.CASCADE :级联操作.如果外键对应的那条数据被删除了,那么这条数据也会被删除.2.PROTECT :受保护.即只要这条数据引用了外键的那条数据,那么就不能删除外键的那条数据.3.SET_NULL:设置为空.如果外键的那条数据被删除了,那么在本条数据上就将这个字段设置为空.如果设置这个选项,前提是要指定这个字段可以为空.4.SET_DEFAUL