数据结构与算法_BST树_BST树的定义及删除操作

news/2024/12/22 18:42:36/

先写BST树的定义及特点,然后记录BST数的删除操作。

1 BST定义及特点

BST数是一棵特殊的二叉树,如何能得到一颗二叉搜索树呢?下面一个有序序列,经过二分搜索,得到的就是一颗BST树。根节点就是当前一轮要搜索的中间节点。
在这里插入图片描述BST树称作二叉搜索树(Binary Search Tree)或者二叉排序树(Binary Sort Tree),它或者是一颗空树;或者是具有下列性质的二叉树:
1 、若左子树不为空,则左子树上所有节点的值均小于它的根节点的值
2 、若右子树不为空,则右子树上所有节点的值均大于它的根节点的值
3 、左右子树也分别满足二叉搜索树性质
特点 :每一个节点都满足 左孩子的值(不为空) < 父节点的值 < 右孩子的值(不为空);比如上图中,24 < 58 < 67
二叉树层数和节点的个数的关系;
二分搜索就是从根搜到叶子节点,因此,BST的时间复杂度是O(logN)

2 BST数删除操作

删除节点时,有两个概念需要分清楚:
前驱节点:当前节点左子树中值最大的节点。
后继节点:当前节点右子树中值最小的节点,就是右子树中最左边的值。
假设要删除的节点就是当前遍历到的节点
1 如果当前节点没有孩子节点,父节点地址域置为nullptr;
2 如果当前节点只有一个孩子节点,让父节点指向当前节点。
在这里插入图片描述
3 如果当前节点有两个孩子节点,找到当前节点的前驱节点,用前驱节点覆盖当前节点的值,然后直接删除前驱或者后继节点的值。
在这里插入图片描述
代码实现时候,先实现情况3。

	/* 功能:删除二叉树中的val节点** 参数:*		const T & val: 待删除的节点*/void n_remove(const T & val){if (root_ == nullptr){return;}// 搜索待删除的节点,cur指向当前搜索的节点,parent指向cur的父节点Node *parent = nullptr;Node *cur = root_;while (cur != nullptr){if (cur->data_ == val)   // 如果当前是根节点,说明找到了,先break出来,在情况1和2时处理。{break;  }else if (comp_(cur->data_, val))  // 用函数对象比较,如果当前节点值小于val,就从当前节点的右边找{parent = cur;cur = cur->right_;}else      // 否则就从左边找{parent = cur;cur = cur->left_;}}// 如果找不到要删除的节点,返回 if (cur == nullptr){return;}// 走到这里说明已经找到了当前要删除的节点:比如上图中67的情况// 开始判断,先判断如果当前待删除节点有两个孩子,找孩子的前驱节点if (cur->left_ != nullptr && cur->right_ != nullptr){parent = cur;Node *pre = cur->left_;while (pre->right_ != nullptr)   // 找前驱节点{parent = pre;pre = pre->right_;}cur->data_ = pre->data_;cur = pre;					// cur指向当前要删除的节点,parent指向其父节点。}// 找出parent最后指向的左孩子还是右孩子Node *child = cre->left_;if (child == nullptr){child = cur->right_;}// 表示删除的是根节点:根节点的parent是空间点if (parent == nullptr){root_ = child;}else {// 把待删除节点 写入父节点中if (parent->left_ == cur){parent->left_ = child;}else{parent->right_ = child;}}delete cur;  // 删除当前节点}

http://www.ppmy.cn/news/759168.html

相关文章

008.【查找算法】六种查找算法的时间复杂度

1. 算法概述 顺序查找算法&#xff1a;按照数据的顺序一项一项逐个查找&#xff0c;所以不管数据顺序如何&#xff0c;都要从头到尾的遍历一次。速度比较慢&#xff0c;它的时间复杂度是 TO(n)。二分查找算法&#xff1a;将数据分割成两等份&#xff0c;然后用键值(要查找的数…

bst java_Java的BST ZoneId代表什么?

我在DB中存储了这个时间框架&#xff1a;伦敦(BST)的15:00到16:00的任何一天 当我在此时间帧之间收到事件时,我需要执行一个程序IF. 我现在在巴黎(16:22)运行测试,在伦敦是15:22(因此在存储在数据库中的时间帧之间). 这是我的代码 // create Local Date Time from what I have …

BST原理剖析及Java实现

BST原理剖析及Java实现 BST概念BST 实现原理BST 查找原理BST 插入原理BST 删除原理 Java实现二叉查找树BST类测试 BST 存在的问题 BST概念 二叉查找树(Binary Search Tree&#xff0c;简称BST)是一棵二叉树&#xff0c;它的左子节点的值比父节点的值要小&#xff0c;右节点的值…

【C++】二叉搜索树(BST)

一.基本介绍 特征&#xff1a; 二叉搜索树&#xff0c;也被称为二叉查找树、有序二叉树或者排序二叉树。 ∙ \bullet ∙ 一般来说输入的第一个数作为根结点&#xff0c;当继续输入数时&#xff0c;小于根结点的放在根结点左边&#xff0c;大于根结点的放在根结点右边。 ∙ \…

数据结构及算法 | Java数据结构——BST二叉搜索树(上)

一、BST相关概念 BST&#xff08;二叉搜索树&#xff09;可以实现增加、删除、搜索的时间复杂度都为log2n(以2为底&#xff0c;并非2n)。关于树的基础概念根据图中数据解释以便理解&#xff1a; 58是根节点root&#xff1b;23是58的左孩子&#xff1b;82是58的右孩子&#xf…

二叉查找树(BST)|搜索及插入操作

什么是二叉查找树&#xff1f; 二叉查找树&#xff08;BST&#xff09;&#xff0c;又名二叉搜索树是一种基于节点的二叉树数据结构&#xff0c;具有以下属性&#xff1a; 节点的左子树仅包含值小于自身值的节点。节点的右子树只包含值大于自身值的节点。左右子树也必须是二…

BST树

目录 一、BST树二、查找操作递归实现非递归实现 三、插入操作递归实现非递归实现 四、删除操作递归实现非递归实现 一、BST树 二叉查找树&#xff08;Binary Search Tree&#xff09;,又名二叉搜索树或二叉排序树。可以是一颗空树&#xff0c;或者是具有下列性质的二叉树&…

LeetCode 938. Range Sum of BST 时间复杂度(O(n))

时间复杂度&#xff08;O(n)&#xff09;, 搜索二叉树树的遍历 # Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val x # self.left None # self.right Noneclass Solution:def rangeSumBST(self, r…