算法4-10:BST平衡二叉树的删除操作
偷懒方法
public void delete(Key key) {
insert(key, null);
}
这样的方法就是将key相应的值覆盖成null。当读取该键值的时候将会返回null。
这是一种偷懒的办法,可是在严肃的实际应用中肯定不能这样,一方面会造成内存浪费,还有一方面性能会越来越慢。
正规方法
先从简单的问题開始吧,怎样删掉BST中最小的键呢?
先找到最小的键,然后将右子节点挂在父节点上。
代码:
public void deleteMin() {
root = deleteMin(root);
}
private Node deleteMin(Node node) {
if(node.left != null) {
node.left = deleteMin(node.left);
node.count -= 1;
return node;
} else {
return node.right;
}
}
删除随意节点
删除随意节点的时候有三种情况能够考虑:
删除一个没有子节点的节点很easy了,仅仅要返回null就可以
删除一个仅仅有一个子节点的节点须要返回它唯一的一个子节点
最难的问题在于删除一个有两个子节点的节点。这时候就要将右子树中最小的节点分离出来。放在该节点原本的位置。这就是Hibbard删除法。
可是Hibbard删除法在使用一段时间后发现。整个树变得越来越不平衡。因此Hibbard删除法的平均复杂度是sqrtN。有人提出删除的时候随机取出左側或右側的继承节点。
代码:
public void delete(Key key) {
root = delete(root, key);
}
private Node delete(Node node, Key key) {
// 先定位到须要删除的点
if(node == null) return null;
int compare = key.compareTo(node.key);
if(compare < 0) {
node.left = delete(node.left, key);
updateCount(node);
return node;
} else if(compare > 0) {
node.right = delete(node.right, key);
updateCount(node);
return node;
}
// 已定位到相应的节点,開始删除。下面是没有子节点或仅仅有1个子节点的情况
if(node.left == null) return node.right;
if(node.right == null) return node.left;
// 有两个子节点时,採用Hibbard删除法,取出右側最小的节点代替被删除的节点
Node minNode = minNode(node.right);
node.right = deleteMin(node.right);
minNode.left = node.left;
minNode.right = node.right;
updateCount(minNode);
return minNode;
}
private void updateCount(Node node) {
node.count = 1+size(node.left)+size(node.right);
}
private Node minNode(Node root) {
if(root == null) return null;
Node node = root;
while(node.left != null) {
node = node.left;
}
return node;
}
兴许章节将会介绍红黑树,它能保证全部的操作都能保证logN复杂度。
算法4-10:BST平衡二叉树的删除操作的更多相关文章
- 平衡二叉树算法实现 c语言版 插入 删除
#include <stdio.h>#include <malloc.h>#include<stdlib.h> #define EQ(a,b) ((a)==(b)) ...
- 算法与数据结构(十一) 平衡二叉树(AVL树)
今天的博客是在上一篇博客的基础上进行的延伸.上一篇博客我们主要聊了二叉排序树,详情请戳<二叉排序树的查找.插入与删除>.本篇博客我们就在二叉排序树的基础上来聊聊平衡二叉树,也叫AVL树,A ...
- 算法与数据结构(十一) 平衡二叉树(AVL树)(Swift版)
今天的博客是在上一篇博客的基础上进行的延伸.上一篇博客我们主要聊了二叉排序树,详情请戳<二叉排序树的查找.插入与删除>.本篇博客我们就在二叉排序树的基础上来聊聊平衡二叉树,也叫AVL树,A ...
- MyBatis知多少(22)MyBatis删除操作
本节从表中使用MyBatis删除记录. 我们已经在MySQL下有EMPLOYEE表: CREATE TABLE EMPLOYEE ( id INT NOT NULL auto_increment, f ...
- ***Redis hash是一个string类型的field和value的映射表.它的添加、删除操作都是O(1)(平均)。hash特别适合用于存储对象
http://redis.readthedocs.org/en/latest/hash/hset.html HSET HSET key field value (存一个对象的时候key存) 将哈希 ...
- Java创建二叉搜索树,实现搜索,插入,删除操作
Java实现的二叉搜索树,并实现对该树的搜索,插入,删除操作(合并删除,复制删除) 首先我们要有一个编码的思路,大致如下: 1.查找:根据二叉搜索树的数据特点,我们可以根据节点的值得比较来实现查找,查 ...
- Java中list如何利用遍历进行删除操作
转: Java中list如何利用遍历进行删除操作 2018年03月31日 10:23:41 Little White_007 阅读数:3874 Java三种遍历如何进行list的便利删除: 1.f ...
- Golang map 如何进行删除操作?
Cyeam 关注 2017.11.02 10:02* 字数 372 阅读 2784评论 0喜欢 3 map 的删除操作 Golang 内置了哈希表,总体上是使用哈希链表实现的,如果出现哈希冲突,就把冲 ...
- ADO.NET 使用DELETE语句批量删除操作,提示超时,删除失败,几种优化解决思路
起因是如此简单的一句sql 提示:Timeout 时间已到.在操作完成之前超时时间已过或服务器未响应. 提供几种解决思路: 1.检查WHERE条件中字段是否已建索引 2.检查是否被其他表引用,引用表外 ...
随机推荐
- 基于flask的网页聊天室(二)
基于flask的网页聊天室(二) 前言 接上一次的内容继续完善,今天完成的内容不是很多,只是简单的用户注册登录,内容具体如下 具体内容 这次要加入与数据哭交互的操作,所以首先要建立相关表结构,这里使用 ...
- Python3.6中文文档 又来推荐一个,之前的Python3.52看得有点懵逼 https://www.rddoc.com/doc/Python/3.6.0/zh/
https://www.rddoc.com/doc/Python/3.6.0/zh/ 大家有空看下
- #region 私有字段
#region 私有字段 private string _读者类别; private string _读者类别名称; priva ...
- 【数学】codeforces A. Success Rate
http://codeforces.com/contest/773/problem/A [思路] 用 (x+a)/(y+b) = p/q 来表示其核心思想,其中a 为做对的题目,b为做的题目,则有x+ ...
- 【树形DP】codeforces K. Send the Fool Further! (medium)
http://codeforces.com/contest/802/problem/K [题意] 给定一棵树,Heidi从根结点0出发沿着边走,每个结点最多经过k次,求这棵树的最大花费是多少(同一条边 ...
- sgu179 SGU起航!
//发现dfs除了搜索功能外的其他功能,他本身是一种序列,这个题恰是"先序"的下一个(合法范围内)序列! #include<iostream> #include< ...
- loj517 计算几何瞎暴力(Trie树)
题目: https://loj.ac/problem/517 分析: 操作4比较特殊,我们先来分析下操作4 操作4相当于需要一个数据结构,使得里面的数据有序(这有很多选择) 结合操作1,操作4的“排序 ...
- oracle rac 安装错误整理。
今天是2014.05.26,离别N久的博客今天继续使用. 近期一直忙着离职.入职另外加上家的网一直没有交费,弄的自己開始不那么安稳.学习就是须要一种心情平静.内心稳妥的去进行. 因换笔记本,特须要又一 ...
- linux 中断机制浅析
一.中断相关结构体 1.irq_desc中断描述符 struct irq_desc { #ifdef CONFIG_GENERIC_HARDIRQS_NO_DEPRECATED struct irq_ ...
- History(历史)命令用法 15 例
如果你经常使用 Linux 命令行,那么使用 history(历史)命令可以有效地提升你的效率.本文将通过实例的方式向你介绍 history 命令的 15 个用法. 使用 HISTTIMEFORMAT ...