首页 > 编程语言 >C#数据结构-红黑树实现

C#数据结构-红黑树实现

时间:2023-06-05 18:04:20浏览次数:55  
标签:node 删除 C# value 查找 红黑树 数据结构 节点

参考网址: https://zhuanlan.zhihu.com/p/353948322

二叉查找树,他对于大多数情况下的查找和插入在效率上来说是没有问题的,但是他在最差的情况下效率比较低。

红黑树保证在最坏的情况下插入和查找效率都能保证在对数的时间复杂度内完成。

红黑树的性质:

性质1.节点是红色或黑色
性质2.根是黑色
性质3.所有叶子都是黑色(叶子是NIL节点)
性质4.如果一个节点是红的,则它的两个子节点都是黑的(从每个叶子到根的所有路径上不能有两个连续的红色节点)
性质5.从任一节点到其叶子的所有路径都包含相同数目的黑色节点。

注:清晰理解红黑树的性质,对红黑树算法的实现有非常重要的作用。

最近发现一个旧金山大学计算机系的一个网站,可以根据你输入的插入、删除和查找的的值,提供非常直观的插入、删除和查找动画展示,删除选取的左子树的最大节点作为删除节点的替换节点。超链接地址

C#数据结构-红黑树实现_子节点

简述一下,红黑树的查找和删除的实现原理:

红黑树的查找:

将要查找的value和节点的value比较,如果小于,那么就在Left Node节点查找;如果大于,则在Right Node节点查找,如果相等,更新Value。

红黑树的删除:

1.如果删除节点没有子节点,直接返回null

2.如果只有一个子节点,返回其子节点代替删除节点即可

3.当左右子节点都不为空时,找到其右子树中的最小节点,替换删除节点的位置

在实现原理上,红黑树的查找和删除,跟二叉查找树是一致的。不过,为了保证树在插入、删除完成之后,保持红黑树的平衡状态,需要实现更多更复杂的逻辑。

using System;
using System.Collections.Generic;

namespace StructScript
{
    /// 红黑树定义:
    /// 性质1.节点是红色或黑色
    /// 性质2.根是黑色
    /// 性质3.所有叶子都是黑色(叶子是NIL节点)
    /// 性质4.如果一个节点是红的,则它的两个子节点都是黑的(从每个叶子到根的所有路径上不能有两个连续的红色节点)
    /// 性质5.从任一节点到其叶子的所有路径都包含相同数目的黑色节点。
    public class RedBlackTree<T>
    {
        //根节点
        private RedBlackTreeNode<T> mRoot;
        //比较器
        private Comparer<T> mComparer;
        private const bool RED = true;
        private const bool BLACK = false;

        public RedBlackTree()
        {
            mRoot = null;
            mComparer = Comparer<T>.Default;
        }

        public bool Contains(T value)
        {
            RedBlackTreeNode<T> node;
            return Contain(value, out node);
        }

        public bool Contain(T value, out RedBlackTreeNode<T> newNode)
        {
            if (value == null)
            {
                throw new ArgumentNullException();
            }
            newNode = null;
            RedBlackTreeNode<T> node = mRoot;
            while (node != null)
            {
                int comparer = mComparer.Compare(value, node.Data);
                if (comparer > 0)
                {
                    node = node.RightChild;
                }
                else if (comparer < 0)
                {
                    node = node.LeftChild;
                }
                else
                {
                    newNode = node;
                    return true;
                }
            }
            return false;
        }

        public void Add(T value)
        {
            if (mRoot == null)
            {
                // 根节点是黑色的
                mRoot = new RedBlackTreeNode<T>(value, BLACK);
            }
            else
            {
                // 新插入节点是红色的
                Insert1(new RedBlackTreeNode<T>(

标签:node,删除,C#,value,查找,红黑树,数据结构,节点
From: https://blog.51cto.com/u_4018548/6418207

相关文章

  • C#读写锁ReaderWriterLockSlim的使用
    读写锁的概念很简单,允许多个线程同时获取读锁,但同一时间只允许一个线程获得写锁,因此也称作共享-独占锁。在C#中,推荐使用ReaderWriterLockSlim类来完成读写锁的功能。某些场合下,对一个对象的读取次数远远大于修改次数,如果只是简单的用lock方式加锁,则会影响读取的效率。而如果采用读......
  • C++11中的std::function
    看看这段代码先来看看下面这两行代码:std::function<void(EventKeyboard::KeyCode,Event*)>onKeyPressed;std::function<void(EventKeyboard::KeyCode,Event*)>onKeyReleased;这两行代码是从Cocos2d-x中摘出来的,重点是这两行代码的定义啊。std::function这是什么东西?如果你对上......
  • ChatJPT:开创人机交互新纪元的技术突破
      人工智能技术的快速发展正在深刻改变着我们与机器之间的交互方式。ChatJPT作为一项创新的技术,为人机交互带来了全新的可能性。本文将探讨ChatJPT的技术原理、应用场景以及对未来社会的影响。ChatJPT的技术原理ChatJPT是基于GPT-3.5架构开发的大型语言模型,它具备深度学习和自......
  • 使用 TypeScript 探索面向对象编程
    在软件开发领域,面向对象编程(OOP)已成为创建复杂且可扩展应用程序的基本范例。支持OOP概念的最流行的编程语言之一是TypeScript。TypeScript是JavaScript的超集,它增加了静态类型和其他功能以增强代码的可维护性和可读性。在这篇博客中,我们将探讨TypeScript中面向对象编程......
  • Q370qC化学成分、Q370qC钢板力学性能、Q370qC钢板期货订轧
    一、Q370qC钢板简介:Q370qC属于桥梁用钢板,Q370qC钢板不仅有非常高的强度钢还有足够的韧性,多数应用在铆接及栓焊结构的公路桥及铁路桥梁结构等应用非常之广泛也是搭建桥梁的不可缺失的材料之一。Q370qC桥梁板执行标准为;GB/T714-2014.Q370qC钢板牌号表示:“Q”:表示钢的屈服强度的“屈”......
  • 使用 python-fire 快速构建 CLI
    命令行应用程序是开发人员最好的朋友。想快速完成某事?只需敲击几下键盘,您就已经拥有了想要的东西。Python是许多开发人员在需要快速组合某些东西时选择的第一语言。但是我们拼凑起来的东西在大多数时候并不是一个完整的CLI,您需要管理标志、解析参数、链接子命令等等,这很麻烦,因此......
  • C# new 和override重写的区别
    在C#中,函数前面加override和new都可以实现函数的重写(Overriding)。不过它们实现的方式不同,因此会有一些区别。1.Override在C#中,override关键字主要用于重写父类中虚方法(VirtualMethod),它表示子类中的方法会覆盖父类中的同名方法。使用override关键字后,子类的方法必须......
  • 前端实现导出word文档docx格式
    说明前端实现导出word文档,我们需要用到docxtemplater这个库使用的是vue2.6和vue-cli5还需要准备一个word模板,更多模板变量请去docxtemplater官网获取准备word模板安装需要用到的库//安装docxtemplaternpminstalldocxtemplaterpizzip--save//安装jszip-utilsn......
  • AH8669_交流AC220V降压转5V 300MA左右非隔离电源方案
    AH8669是一颗低成本的非隔离开关高性能交流转直流的转换器降压芯片,内部集成650V高耐压功率MOSFET额定700MA电流输出,非常适应于消费类的小家电控制模块以及给MCU供电和智能插座的家用电器上,交流转12V外围元件少,电路简单,内部集成软启动电路具有多功能保护有过载保护、过压保护、......
  • 嵌入式知识分享:Docker容器部署方法说明
    前 言本指导文档适用开发环境:Windows开发环境:Windows764bit、Windows1064bitLinux开发环境:Ubuntu18.04.464bit虚拟机:VMware15.1.0Docker是一个开源的应用容器引擎,让开发者可打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows机器上,亦......