首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在C#中删除BST的功能

是指在二叉搜索树(Binary Search Tree,BST)中删除指定节点的操作。BST是一种特殊的二叉树,它满足以下性质:

  1. 左子树上的所有节点的值都小于根节点的值。
  2. 右子树上的所有节点的值都大于根节点的值。
  3. 左右子树也都是BST。

删除BST中的节点可以分为以下几种情况:

  1. 要删除的节点是叶子节点(没有子节点):直接删除该节点即可。
  2. 要删除的节点只有一个子节点:将该节点的子节点替换为该节点的位置。
  3. 要删除的节点有两个子节点:找到该节点的后继节点(右子树中最小的节点),将后继节点的值复制到要删除的节点中,然后删除后继节点。

以下是一个示例代码,演示如何在C#中删除BST的功能:

代码语言:txt
复制
using System;

public class TreeNode
{
    public int val;
    public TreeNode left;
    public TreeNode right;

    public TreeNode(int val)
    {
        this.val = val;
        left = null;
        right = null;
    }
}

public class BST
{
    private TreeNode root;

    public BST()
    {
        root = null;
    }

    public void Insert(int val)
    {
        root = InsertNode(root, val);
    }

    private TreeNode InsertNode(TreeNode node, int val)
    {
        if (node == null)
        {
            return new TreeNode(val);
        }

        if (val < node.val)
        {
            node.left = InsertNode(node.left, val);
        }
        else if (val > node.val)
        {
            node.right = InsertNode(node.right, val);
        }

        return node;
    }

    public void Delete(int val)
    {
        root = DeleteNode(root, val);
    }

    private TreeNode DeleteNode(TreeNode node, int val)
    {
        if (node == null)
        {
            return null;
        }

        if (val < node.val)
        {
            node.left = DeleteNode(node.left, val);
        }
        else if (val > node.val)
        {
            node.right = DeleteNode(node.right, val);
        }
        else
        {
            if (node.left == null && node.right == null)
            {
                // Case 1: 要删除的节点是叶子节点
                node = null;
            }
            else if (node.left == null)
            {
                // Case 2: 要删除的节点只有右子节点
                node = node.right;
            }
            else if (node.right == null)
            {
                // Case 2: 要删除的节点只有左子节点
                node = node.left;
            }
            else
            {
                // Case 3: 要删除的节点有两个子节点
                TreeNode successor = FindMin(node.right);
                node.val = successor.val;
                node.right = DeleteNode(node.right, successor.val);
            }
        }

        return node;
    }

    private TreeNode FindMin(TreeNode node)
    {
        while (node.left != null)
        {
            node = node.left;
        }

        return node;
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        BST bst = new BST();
        bst.Insert(5);
        bst.Insert(3);
        bst.Insert(7);
        bst.Insert(2);
        bst.Insert(4);
        bst.Insert(6);
        bst.Insert(8);

        Console.WriteLine("BST before deletion:");
        InorderTraversal(bst.root);

        bst.Delete(3);

        Console.WriteLine("BST after deletion:");
        InorderTraversal(bst.root);
    }

    private static void InorderTraversal(TreeNode node)
    {
        if (node != null)
        {
            InorderTraversal(node.left);
            Console.Write(node.val + " ");
            InorderTraversal(node.right);
        }
    }
}

以上代码演示了如何在C#中实现BST的插入和删除功能。在删除节点时,根据节点的情况进行相应的操作,保持BST的性质。可以通过调用bst.Delete(val)来删除BST中的节点。

这里推荐腾讯云的云数据库 TencentDB,它提供了高可用、高性能、弹性扩展的数据库服务,适用于各种规模的应用场景。具体产品介绍和链接地址请参考腾讯云官方文档:腾讯云数据库 TencentDB

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

BST:Transformer推荐领域应用

3.Transformer Layer Multi-head Self-attention Transformer最令人印象深刻非Multi-head Self-attention莫属,BSTMulti-head...目的都是让该层参数稳定下来,避免梯度消失或者梯度爆炸,方便后续学习。 一般来说,BN更适合特征依赖于不同样本间统计参数。因为它删除了不同特征之间大小关系,但是保留了不同样本间大小关系。...所以CV领域更常用。 而在NLP领域,LN就更加合适。因为它删除不同样本间大小关系,但保留了一个样本内不同特征之间大小关系。...相比于阿里出品其他论文,稍显寡淡。 随着Transformer和BertNLP领域效果上一枝独秀,推荐领域有越来越多模型开始借鉴、迁移NLP优秀技术。...如本篇BST、关注特征交叉AutoInt、还是下一篇要介绍BERT4Rec都是典型代表。

1.1K30

LeetCode 450: 删除二叉搜索树节点 Delete Node in a BST

题目: 给定一个二叉搜索树根节点 root 和一个值 key,删除二叉搜索树 key 对应节点,并保证二叉搜索树性质不变。返回二叉搜索树(有可能被更新)根节点引用。...Given a root node reference of a BST and a key, delete the node with the given key in the BST....5 / \ 2 6 \ \ 4 7 解题思路: 待删除节点在二叉树三种情况有: 如果目标节点没有子节点,我们可以直接移除该目标节点。...另外二叉搜索树序遍历结果为从小到大顺序排列; 删除节点如果不是叶子节点时, 则应把该节点值替换为其右子树中最小一个节点值 (删除节点后驱节点); 删除节点如果不是叶子节点且无右子树时, 则应把该节点值替换为其左子树中最大一个节点值...(删除节点前驱节点), 并在子树递归删除刚刚替换节点 你会发现, 二叉搜索树最小节点为该树最左叶子; 最大节点为该树最右叶子, 即: 如果 key > root.val,说明要删除节点在右子树

1.1K20

C# 9.0 新增功能

系列目录 【已更新最新开发文章,点击查看详细】 C# 9.0 向 C# 语言添加了以下功能和增强功能: 记录 仅限 Init 资源库 顶级语句 模式匹配增强功能 本机大小整数 函数指针 禁止发出...3、顶级语句 顶级语句从许多应用程序删除了不必要流程。 请考虑规范“Hello World!”...4、模式匹配增强功能 C# 9 包括新模式匹配改进: 类型模式要求变量是一种类型时匹配 带圆括号模式强制或强调模式组合优先级 联合 and 模式要求两个模式都匹配 析取 or 模式要求任一模式匹配...6、调整和完成功能 还有其他很多功能有助于更高效地编写代码。 C# 9.0 ,已知创建对象类型时,可在 new 表达式中省略该类型。... C# 9.0 之前,分部方法为 private,但不能指定访问修饰符、不能返回 void,也不能具有 out 参数。 这些限制意味着,如果未提供任何方法实现,编译器会删除对分部方法所有调用。

1.7K20

第39期:小白一看就会 BST 删除!

两节,我们了解了BST(二叉搜索树)概念,并且知道了如何在BST查找一个元素。那我们又如何在BST中去删除一个元素呢?我们将通过本节例题进行学习! 下面我们仍然通过例题进行讲解。...01、题目分析 第450题:删除二叉搜索树节点 给定一个二叉搜索树根节点 root 和一个值 key,删除二叉搜索树 key 对应节点,并保证二叉搜索树性质不变。...如下图就是一棵典型BST: ?...我们要删除BST一个节点,首先需要找到该节点。而找到之后,会出现三种情况。 1、待删除节点左子树为空,让待删除节点右子树替代自己。 ?...2、待删除节点右子树为空,让待删除节点左子树替代自己。 ? 3、如果待删除节点左右子树都不为空。我们需要找到比当前节点小最大节点(前驱),来替换自己 ?

2.6K10

定期删除文件夹文件——C#

下面是自定义一个函数,参数分别为:文件夹名称、文件后缀、保存天数 逻辑是获取当前系统时间,和文件创建时间去作差,如果结果大于保存天数,就删除它 /// ...; 单位:天 { File.Delete(file); //删除超过时间文件 }...} } 调用如下: 我把文件夹路径存到ini文件,首先读出路径 同样把保存天数存到ini文件(存是控件ridiobutton索引值,具体操作点击这里),然后读出索引值再使用switch...来解析索引值对应天数 最后调用删除文件函数,这里删除是excel表格,注意格式为" *.xls ",*不能省略 ?...= pathHeard + pathLast; //文件路径 string deleteDay = Ini.IniReadValue("清除文件", "day"); //定期删除文件天数

2.2K41

C# SQLiteC#安装与操作

SQLite 介绍 SQLite,是一款轻型数据库,用于本地数据储存。...先说说优点,它占用资源非常低,嵌入式设备需要几百K内存就够了;作为轻量级数据库,他处理速度也足够快;支持容量级别为T级;独立: 没有额外依赖;开源;支持多种语言; 我用途 项目开发,...因为数据库实时数据同步,需要记录更新时间,系统日志等等数据;当然,你也可以选择写ini和xml等等配置文件来解决,但是都如数据库可读性高不是。 安装 1....引用 .NET 驱动 http://system.data.sqlite.org/index.html/doc/trunk/www/index.wiki 这三个文件,项目中,引用之后就可以进行创建数据库查询数据操作...2.使用vs提供包管理工具Nuget进行项目引用。 Nuget包管理工具 搜索SQLite安装对应包,下载完成后就自动项目中引用了。

2K21

FluentValidationC# WPF应用

其实它也可以用于WPF属性验证,本文主要也是讲解该组件WPF使用,FluentValidation官网是: https://fluentvalidation.net/ 。...本文需要实现功能unsetunset 提供WPF界面输入验证,采用MVVM方式,需要以下功能: 能验证ViewModel定义基本数据类型属性:int\string等; 能验证ViewModel定义复杂属性...复杂属性:我遇到问题是,怎么验证ViewModel对象属性子属性?...创建验证器 验证属性写法有两种: 可以实体属性上方添加特性(本文不作特别说明,百度文章介绍很多); 通过代码形式添加,如下方,创建一个验证器类,继承自AbstractValidator,在此验证器构造函数写规则验证属性...表示关联集合项验证器。

12610

C#深复制和浅复制(C#克隆对象)

C# 支持两种类型:“值类型”和“引用类型”。  值类型(Value Type)(如 char、int 和 float)、枚举类型和结构类型。 ...以它们计算机内存如何分配来划分 值类型与引用类型区别? 1,值类型变量直接包含其数据, 2,引用类型变量则存储对象引用。...值类型隐式继承自System.ValueType  所以不能显示让一个结构继承一个类,C#不支持多继承 堆栈(stack)是一种先进先出数据结构,在内存,变量会被分配在堆栈上来进行操作。...堆(heap)是用于为类型实例(对象)分配空间内存区域,堆上创建一个对象, 会将对象地址传给堆栈上变量(反过来叫变量指向此对象,或者变量引用此对象)。...改变目标对象引用类型字段值它将反映到原始对象,因为拷贝是指向堆是上一个地址 深拷贝:深拷贝与浅拷贝不同是对于引用字段处理,深拷贝将会在新对象创建一个新对象和         原始对象对应字段相同

45510

字符串删除特定字符

题目:输入两个字符串,从第一字符串删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后第一个字符串变成”Thy r stdnts.”。...首先我们考虑如何在字符串删除一个字符。由于字符串内存分配方式是连续分配。我们从字符串当中删除一个字符,需要把后面所有的字符往前移动一个字节位置。...具体实现,我们可以定义两个指针(pFast和pSlow),初始时候都指向第一字符起始位置。当pFast指向字符是需要删除字符,则pFast直接跳过,指向下一个字符。...这样,前面被pFast跳过字符相当于被删除了。用这种方法,整个删除O(n)时间内就可以完成。 接下来我们考虑如何在一个字符串查找一个字符。当然,最简单办法就是从头到尾扫描整个字符串。...这个时候,要查找一个字符就变得很快了:根据这个字符ASCII码,在数组对应下标找到该元素,如果为0,表示字符串没有该字符,否则字符串包含该字符。此时,查找一个字符时间复杂度是O(1)。

8.9K90

漫画:二叉树系列 第五讲(BST删除

两节,我们了解了BST(二叉搜索树)概念,并且知道了如何在BST查找一个元素。那我们又如何在BST中去删除一个元素呢?我们将通过本节例题进行学习! 下面看题:??...01 第450题:二叉搜索树删除 第450题:给定一个二叉搜索树根节点 root 和一个值 key,删除二叉搜索树 key 对应节点,并保证二叉搜索树性质不变。...如下图就是一棵典型BST: 03 图解分析 明确了概念,我们进行分析。...我们要删除BST一个节点,首先需要找到该节点。而找到之后,会出现三种情况。 待删除节点左子树为空,让待删除节点右子树替代自己。 待删除节点右子树为空,让待删除节点左子树替代自己。...无论是不理解还是有别的解题思路都可以评论区进行留言~ 如果已完全掌握,一定记得点击右方“在看”进行每日打卡! 还没进群小伙伴抓紧啦!

1.8K10

PuppeteerSharp库C#应用案例

本文将介绍如何使用PuppeteerSharp库C#实现下载千图网图片并保存为PDF文件案例。...PuppeteerSharp技术PuppeteerSharp 提供了一系列丰富功能,包括但不限于:●模拟用户操作:可以模拟用户浏览器点击、输入等操作。...抓取思路分析1分析页面请求:使用Chrome开发者工具或类似工具分析千图网页面请求,找到图片数据来源。2找到数据来源:确定图片数据是通过接口获取还是直接嵌入页面。...实际项目中,我们需要根据具体需求和网站结构来编写更复杂爬取和保存逻辑。...如何解析抓取来内容当解析来内容时,我们可以使用C#Json.NET库或者内置System.Text.Json库来处理JSON格式数据。

26310

.NET警惕C#is var写法

本文将和大家介绍 C# 语言设计里面,我认为比较坑一个语法。...F2={f2}"); } 答案是控制台居然输出居然进来了,也就是说 null is 判断里面是通过,而 var 含义似乎不只是一个语法上可有可无关键词而已,而是赋予了运行时含义关键词 换句话说就是以上代码里面的...最初 C# 里面的 var 只是一个构建过程可以被平替为具体类型关键词,是一个不会影响到语义、运行时逻辑语法而已。...然而在 is 这里面,将 var 当成了一个可以处理空值特殊语法结构 这和咱长久使用 is 来过滤空值编程思想是冲突,我感觉绝大部分开发者写到 is var 过程,将会想着应该是自动过滤掉...难道有这么多开发者大佬脑袋都被大门夹了? 整个 C# 语言设计是不断迭代,现在已经是 C# 12 了。

10810

SQLiteC#安装与操作

SQLite 介绍 SQLite,是一款轻型数据库,用于本地数据储存。...先说说优点,它占用资源非常低,嵌入式设备需要几百K内存就够了;作为轻量级数据库,他处理速度也足够快;支持容量级别为T级;独立: 没有额外依赖;开源;支持多种语言; 我用途 项目开发,...因为数据库实时数据同步,需要记录更新时间,系统日志等等数据;当然,你也可以选择写ini和xml等等配置文件来解决,但是都如数据库可读性高不是。 安装 1....这三个文件,项目中,引用之后就可以进行创建数据库查询数据操作。 2.使用vs提供包管理工具Nuget进行项目引用。 ? Nuget包管理工具 ?...搜索SQLite安装对应包,下载完成后就自动项目中引用了。

2.6K30
领券