算法学习二,红黑树查找算法

算法学习二,红黑树查找算法

在红黑树的实现中,处理删除操作是一个复杂的过程,特别是当涉及到删除黑色节点时。红黑树的删除操作需要保持树的平衡和性质(即每条路径上的黑色节点数量相同)。以下是对红黑树删除操作的详细解释,特别是针对删除黑色节点的情况。

删除操作概述

  1. 删除节点:首先找到并删除目标节点。
  2. 重新平衡:如果删除的节点是红色,则不需要调整树的结构。但如果删除的是黑色节点,则需要进行重新平衡,以保持红黑树的性质。

重新平衡步骤

当删除一个黑色节点时,可能会导致树失去平衡,因为删除黑色节点会减少一条路径上的黑色节点数量。红黑树的重新平衡操作包括以下几种情况:

  1. 兄弟节点是红色

    • 将父节点和兄弟节点颜色互换。
    • 对父节点进行左旋或右旋。
    • 更新旋转后的新兄弟节点为黑色。
  2. 兄弟节点是黑色,且两个子节点都是黑色

    • 将兄弟节点设为红色。
    • 如果父节点也是黑色,则继续向上调整。
    • 如果父节点是红色,则将父节点设为黑色并结束调整。
  3. 兄弟节点是黑色,且有一个红色的左(右)子节点

    • 将父节点和兄弟节点颜色互换。
    • 对兄弟节点进行右旋或左旋。
    • 将旋转后的新兄弟节点设为黑色,并对新兄弟节点的另一个子节点进行左旋或右旋。

示例代码

以下是一个简化的红黑树删除操作的示例代码:

public void Delete(T key) { RedBlackTreeNode<T> nodeToDelete = Search(key); if (nodeToDelete == null) return; RedBlackTreeNode<T> y = nodeToDelete; bool originalColor = y.Color; RedBlackTreeNode<T> x; if (nodeToDelete.LeftChild == null) { x = nodeToDelete.RightChild; Transplant(nodeToDelete, nodeToDelete.RightChild); } else if (nodeToDelete.RightChild == null) { x = nodeToDelete.LeftChild; Transplant(nodeToDelete, nodeToDelete.LeftChild); } else { y = Min(nodeToDelete.RightChild); originalColor = y.Color; x = y.RightChild; if (y.Parent == nodeToDelete) x.Parent = y; else { Transplant(y, y.RightChild); y.RightChild = nodeToDelete.RightChild; y.RightChild.Parent = y; } Transplant(nodeToDelete, y); y.LeftChild = nodeToDelete.LeftChild; y.LeftChild.Parent = y; y.Color = nodeToDelete.Color; } if (originalColor == Color.Black) FixDelete(x); } private void FixDelete(RedBlackTreeNode<T> x) { while (x != mRoot && x.Color == Color.Black) { if (x == x.Parent.LeftChild) { RedBlackTreeNode<T> w = x.Parent.RightChild; if (w.Color == Color.Red) { w.Color = Color.Black; x.Parent.Color = Color.Red; RotateLeft(x.Parent); w = x.Parent.RightChild; } if (w.LeftChild.Color == Color.Black && w.RightChild.Color == Color.Black) { w.Color = Color.Red; x = x.Parent; } else { if (w.RightChild.Color == Color.Black) { w.LeftChild.Color = Color.Black; w.Color = Color.Red; RotateRight(w); w = x.Parent.RightChild; } w.Color = x.Parent.Color; x.Parent.Color = Color.Black; w.RightChild.Color = Color.Black; RotateLeft(x.Parent); break; } } else { RedBlackTreeNode<T> w = x.Parent.LeftChild; if (w.Color == Color.Red) { w.Color = Color.Black; x.Parent.Color = Color.Red; RotateRight(x.Parent); w = x.Parent.LeftChild; } if (w.RightChild.Color == Color.Black && w.LeftChild.Color == Color.Black) { w.Color = Color.Red; x = x.Parent; } else { if (w.LeftChild.Color == Color.Black) { w.RightChild.Color = Color.Black; w.Color = Color.Red; RotateLeft(w); w = x.Parent.LeftChild; } w.Color = x.Parent.Color; x.Parent.Color = Color.Black; w.LeftChild.Color = Color.Black; RotateRight(x.Parent); break; } } } x.Color = Color.Black; } 

总结

红黑树的删除操作需要仔细处理以保持树的平衡和性质。通过重新平衡操作,可以确保删除黑色节点后树仍然满足红黑树的性质。理解这些操作对于实现高效的红黑树非常关键。

Read more

智能指针:告别内存泄漏的利器----《Hello C++ Wrold!》(27)--(C/C++)

智能指针:告别内存泄漏的利器----《Hello C++ Wrold!》(27)--(C/C++)

文章目录 * 前言 * 智能指针的作用 * 智能指针的实现和原理 * 库里面的智能指针 * std::auto_ptr * auto_ptr的模拟实现 * std::unique_ptr * unique_ptr的模拟实现 * std::shared_ptr * shared_ptr的模拟实现 * shared_ptr的一个弊端 * std::weak_ptr * weak_ptr的模拟实现 * 删除定制器 * 作业部分 前言 在 C++ 编程中,动态内存管理始终是开发者面临的核心挑战之一。手动使用new分配内存、delete释放内存的模式,不仅需要开发者时刻关注内存生命周期,更可能因疏忽导致内存泄漏(忘记调用delete)、二次释放(重复调用delete),或是在异常抛出时因执行流跳转跳过delete语句等问题 —— 这些隐患轻则导致程序性能退化,重则引发崩溃或不可预期的运行错误,成为项目中难以排查的 “隐形 bug”。 为解决这一痛点,C++ 标准库引入了智能指针这一核心工具。

By Ne0inhk
今天你学C++了吗?——map

今天你学C++了吗?——map

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥✨✨✨✨✨✨ 个人主页✨✨✨✨✨✨ 前面我们已经学习了set容器的使用,接下来我们来看看map容器有什么奇妙之处?准备好了吗~我们发车去探索C++的奥秘啦~🚗🚗🚗🚗🚗🚗 目录 什么是map? pair 什么是pair? pair的组成 pair的构造与初始化 pair的成员函数 pair的比较 编辑 pair的用途 map的构造 map的插入 编辑 operator[ ] at multimap equal_range equal_range、lower_bound和upper_bound简单对比 1. equal_range 2. lower_bound 3. upper_bound 对比与联系 C++中map和set容器的简单对比 什么是map?

By Ne0inhk
【C++】C++异常

【C++】C++异常

🎬 个人主页:MSTcheng · ZEEKLOG 🌱 代码仓库 :MSTcheng · Gitee 🔥 精选专栏: 《C语言》 《数据结构》 《算法学习》 《C++由浅入深》 💬座右铭:路虽远行则将至,事虽难做则必成! 在前面的文章中,我们已经介绍了C++11的一些新特性。本文将和下一篇一起为大家讲解C++的最后两个重要主题:异常处理和智能指针。 文章目录 * 一、异常的概念及使用 * 1.1异常的概念 * 1.2异常的分类 * 1.3异常的抛出与捕获 * 1.4栈展开 * 1.5 查找匹配的处理代码 * 1.6异常重新抛出 * 1.7异常的安全问题 * 1.8异常规范 * 二、总结 一、异常的概念及使用 1.1异常的概念 异常(Exception)是指在程序执行过程中发生的意外或错误情况,

By Ne0inhk