当前位置: 首页 > news >正文

C#使用自定义的泛型节点类 Node<T>实现二叉树类BinaryTree<T>及其方法

目录

一、涉及到的知识点

1.Comparer.Default 属性

2.实现二叉树类BinaryTree步骤

(1)先设计一个泛型节点类

(2)再设计一个泛型的二叉树类

(3)最后设计Main方法

二、 使用泛型节点类 Node实现二叉树类BinaryTree


一、涉及到的知识点

1.Comparer<T>.Default 属性

        返回由泛型参数指定的类型的默认排序顺序比较器。

public static System.Collections.Generic.Comparer<T> Default { get; }属性值
Comparer<T>
继承 Comparer<T> 并作为 T 类型的排序顺序比较器的对象。

        Comparer<T>.Default 属性是 C# 中 System.Collections.Generic命名空间下的一个属性。它返回一个 Comparer<T> 对象的默认实例,该对象可以对泛型集合中的对象进行比较。默认情况下,这个比较器根据对象的自然顺序进行比较,即通过调用对象的 CompareTo 方法进行比较。

// Comparer<T>.Default 属性namespace _135_3
{public class Program{public static void Main(string[] args){ArgumentNullException.ThrowIfNull(args);List<int> numbers = [3, 1, 4, 2];// 使用默认比较器对集合进行排序numbers.Sort(Comparer<int>.Default);Console.WriteLine(string.Join(", ", numbers));}}
}
//运行结果:
/*
1, 2, 3, 4*/

        在这个例子中创建了一个包含整数的列表。然后,使用 Comparer<int>.Default 属性提供的默认比较器对列表进行排序。最后,输出排序后的列表,可以看到数字已经按照升序排列。

2.实现二叉树类BinaryTree<T>步骤

(1)先设计一个泛型节点类

public class Node<T>(T value)
{public T Data { get; set; } = value;public Node<T>? Left { get; set; } = null;public Node<T>? Right { get; set; } = null;
}

(2)再设计一个泛型的二叉树类

public class BinaryTree<T>
{public Node<T>? Root { get; private set; }public void AddNode(T value){Node<T> newNode = new(value);if (Root == null){Root = newNode;}else{Node<T> current = Root;while (true){if (Comparer<T>.Default.Compare(value, current.Data) < 0){if (current.Left == null){current.Left = newNode;break;}current = current.Left;}else{if (current.Right == null){current.Right = newNode;break;}current = current.Right;}}}}
}

(3)最后设计Main方法

        定义一个二叉树类的对象,引用类中的方法。

BinaryTree<int> tree = new();

二、 使用泛型节点类 Node<T>实现二叉树类BinaryTree<T>

// 使用泛型节点类 Node<T>设计实现二叉树类
namespace _135_1
{public class Node<T>(T value){public T Data { get; set; } = value;public Node<T>? Left { get; set; } = null;public Node<T>? Right { get; set; } = null;}public class BinaryTree<T>{public Node<T>? Root { get; private set; }public void AddNode(T value){Node<T> newNode = new(value);if (Root == null){Root = newNode;}else{Node<T> current = Root;while (true){if (Comparer<T>.Default.Compare(value, current.Data) < 0){if (current.Left == null){current.Left = newNode;break;}current = current.Left;}else{if (current.Right == null){current.Right = newNode;break;}current = current.Right;}}}}}class Program{static void Main(string[] args){ArgumentNullException.ThrowIfNull(args);BinaryTree<int> tree = new();tree.AddNode(5);tree.AddNode(3);tree.AddNode(8);tree.AddNode(1);tree.AddNode(4);tree.AddNode(7);Console.WriteLine("中序遍历:");PrintInOrder(tree.Root!);Console.WriteLine("前序遍历:");PrintPreOrder(tree.Root!);Console.WriteLine("后序遍历:");PrintPostOrder(tree.Root!);Console.ReadKey();}static void PrintInOrder(Node<int> node){if (node != null){PrintInOrder(node.Left!);Console.WriteLine(node.Data);PrintInOrder(node.Right!);}}static void PrintPreOrder(Node<int> node){if (node != null){Console.WriteLine(node.Data);PrintPreOrder(node.Left!);PrintPreOrder(node.Right!);}}static void PrintPostOrder(Node<int> node){if (node != null){PrintPostOrder(node.Left!);PrintPostOrder(node.Right!);Console.WriteLine(node.Data);}}}
}
//运行结果:
/*
中序遍历:
1
3
4
5
7
8
前序遍历:
5
3
1
4
8
7
后序遍历:
1
4
3
7
8
5*/

        在这个实例中使用 Comparer<T>.Default 来比较两个值的大小。这个方法适用于任何实现了 System.IComparable<T> 接口的类型,因此可以使用任何实现了该接口的值类型或引用类型。

        这个程序的主要功能是添加一个新的节点到二叉树中。它首先检查根节点是否为空,如果为空,则将新的节点设置为根节点。否则,它将从根节点开始,递归地遍历二叉树,找到合适的位置插入新的节点。

        这个程序的实现是正确的,它可以用于存储和操作实现了 System.IComparable<T> 接口的类型。可以根据需要修改和扩展这个程序,例如,可以添加其他方法来遍历和操作二叉树。

相关文章:

C#使用自定义的泛型节点类 Node<T>实现二叉树类BinaryTree<T>及其方法

目录 一、涉及到的知识点 1.Comparer.Default 属性 2.实现二叉树类BinaryTree步骤 &#xff08;1&#xff09;先设计一个泛型节点类 &#xff08;2&#xff09;再设计一个泛型的二叉树类 &#xff08;3&#xff09;最后设计Main方法 二、 使用泛型节点类 Node实现二叉树…...

美团2025春招第一次笔试题

第四题 题目描述 塔子哥拿到了一个大小为的数组&#xff0c;她希望删除一个区间后&#xff0c;使得剩余所有元素的乘积未尾至少有k个0。塔子哥想知道&#xff0c;一共有多少种不同的删除方案? 输入描述 第一行输入两个正整数 n,k 第二行输入n个正整数 a_i&#xff0c;代表…...

用游戏面试应聘者的方法

用游戏面试应聘者的方法 例如使用俄罗斯方块来面试&#xff0c;如果对方对这个游戏没有兴趣&#xff0c;或者是游戏结果不够好&#xff0c; 那么可以肯定的是&#xff0c;这个人做不好文物修复的工作。 象棋或者是围棋之类的棋类下得好的人&#xff0c;一般来说&#xff0c;做…...

C#,老鼠迷宫问题的回溯法求解(Rat in a Maze)算法与源代码

1 老鼠迷宫问题 迷宫中的老鼠,作为另一个可以使用回溯解决的示例问题。 迷宫以块的NN二进制矩阵给出,其中源块是最左上方的块,即迷宫[0][0],目标块是最右下方的块,即迷宫[N-1][N-1]。老鼠从源头开始,必须到达目的地。老鼠只能朝两个方向移动:向前和向下。 在迷宫矩阵…...

c语言: 输出几个数的和

输出几个数的和 任务描述 编程输入最少1个最多不超过4个整数&#xff0c;输出他们的和。 输入样例1&#xff1a;5 6 7 8 输出样例1&#xff1a;26 输入样例2&#xff1a;1 5 输出样例2&#xff1a;6 输入样例3&#xff1a;1 5 4 输出样例3&#xff1a;10 输入样例4&#xff…...

liteIDE 解决go root报错 go: cannot find GOROOT directory: c:\go

liteIDE环境配置 我使用的liteIDE为 x36 5.9.5版本 。在查看–>选项 中可以看到 LiteEnv&#xff0c;双击LiteEnv &#xff0c;在右侧选择对应系统的env文件&#xff0c;我的是win64系统&#xff0c;所以文件名为win64.env 再双击 win64.env &#xff0c;关闭当前窗口&…...

力扣_动态规划1—买卖股票的最佳时机

题目 给定一个数组&#xff0c;它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 注意&#xff1a;你不能同时参与多笔交易&#xff08;你必须在再次购买前出售掉之前的股票&#xff09;。 方法—动态…...

苍穹外卖问题记录(持续更新)

Day01_3.2.4前后端联调 1. 前端无法登录 &#xff08;1&#xff09;确保nginx服务器已经启动 &#xff08;2&#xff09;查看自己数据库的用户名和密码是否和老师的一样&#xff0c;不一样的话需要在application-dev.yml文件中把老师的用户名密码修改成自己的 老师的用户名…...

结合大象机器人六轴协作机械臂myCobot 280 ,解决特定的自动化任务和挑战!(下)

Limo Pro 小车建图导航 引言 前景提要&#xff1a;我们在上文介绍了使用LIMO cobot 实现一个能够执行复杂任务的复合机器人系统的应用场景的项目&#xff0c;从以下三个方面&#xff1a;概念设计、系统架构以及关键组件。 本文主要深入项目内核的主要部分&#xff0c;同样也主要…...

加速 Webpack 构建:提升效率的秘诀

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…...

Qt自定义标题栏的多屏适配

标题栏自定义 参考博客 &#xff1a; https://blog.csdn.net/goforwardtostep/article/details/53494800 多屏适配 MyTitleBar类抽象定义了自定义标题栏&#xff0c;使用起来相对方便。但是在多屏情况下&#xff0c;窗口初次显示只能在主屏幕上&#xff0c;如果拖到其他屏幕…...

【MySQL篇】 MySQL基础学习

文章目录 前言基础数据类型DDL数据库操作查询数据库创建数据库删除数据库使用数据库 DDL表操作创建表查询表修改表删除 DML-增删改添加数据更改数据删除数据 DQL-查询基础查询条件查询聚合函数分组查询排序查询分页查询编写顺序 DML-用户及权限用户管理权限控制 函数字符串函数…...

Qt多弹窗实现包括QDialog、QWidget、QMainWindow

1.相关说明 独立Widget窗口、嵌入式Widget、嵌入式MainWindow窗口、独立MainWindow窗口等弹窗的实现 相关界面包含关系 2.相关界面 3.相关代码 mainwindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include "tformdoc.h" #incl…...

Django高级之-forms组件

Django高级之-forms组件 1 校验字段功能 针对一个实例&#xff1a;注册用户讲解。 模型&#xff1a;models.py class UserInfo(models.Model):namemodels.CharField(max_length32)pwdmodels.CharField(max_length32)emailmodels.EmailField()模版文件 <!DOCTYPE html&g…...

GPT实战系列-LangChain实现简单链

GPT实战系列-LangChain实现简单链 LangChain GPT实战系列-LangChain如何构建基通义千问的多工具链 GPT实战系列-构建多参数的自定义LangChain工具 GPT实战系列-通过Basetool构建自定义LangChain工具方法 GPT实战系列-一种构建LangChain自定义Tool工具的简单方法 GPT实战系…...

关于tomcat服务器配置及性能优化的20道高级面试题

1. 请描述Tomcat服务器的基本架构和组件。 Tomcat服务器的基本架构主要包括Server、Service、Connector和Container等组件。具体来看&#xff1a; Server&#xff1a;是Tomcat中最顶层的容器&#xff0c;代表着整个服务器。它负责运行Tomcat服务器&#xff0c;例如打开和关闭…...

LeetCode 1315.祖父节点值为偶数的节点和

给你一棵二叉树&#xff0c;请你返回满足以下条件的所有节点的值之和&#xff1a; 该节点的祖父节点的值为偶数。&#xff08;一个节点的祖父节点是指该节点的父节点的父节点。&#xff09; 如果不存在祖父节点值为偶数的节点&#xff0c;那么返回 0 。 示例&#xff1a; 输入…...

C语言分支和循环总结

文章目录 概要结构介绍不同结构的语句简单运用小结 概要 C语言中分为三种结构&#xff1a;顺序结构&#xff0c;选择结构&#xff0c;循环结构 结构介绍 顺序结构就是从上到下&#xff0c;从左到右等等&#xff1b;选择结构可以想象是Y字路口就是到了一个地方会有不同的道路…...

【Echarts】曲线图上方显示数字以及自定义值,标题和副标题居中,鼠标上显示信息以及自定义信息

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《前端》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握…...

双环PID控制详细讲解

参考博客&#xff1a; &#xff08;1&#xff09;PID双环控制&#xff08;速度环和位置环&#xff09; &#xff08;2&#xff09;PID控制&#xff08;四&#xff09;&#xff08;单环与双环PID&#xff09; &#xff08;3&#xff09;内外双环pid算法 0 单环PID 目标位置→系…...

Outlook邮箱爆满无法接收邮件怎么办?一篇文章教你用“归档”快速释放空间

&#x1f525;个人主页&#xff1a;杨利杰YJlio❄️个人专栏&#xff1a;《Sysinternals实战教程》《Windows PowerShell 实战》《WINDOWS教程》《IOS教程》《微信助手》《锤子助手》 《Python》 《Kali Linux》《那些年未解决的Windows疑难杂症》&#x1f31f; 让复杂的事情更…...

深入解析Virtio与Vhost在QEMU中的高效协作架构

1. Virtio与Vhost的前世今生 我第一次接触Virtio是在2013年调试KVM虚拟机网络性能时。当时发现一个奇怪现象&#xff1a;使用传统模拟网卡时虚拟机网络吞吐量只有200Mbps左右&#xff0c;而切换到Virtio-net后直接飙到了1Gbps以上。这个性能差距让我开始深入研究这套架构。 V…...

OpenClaw模型热切换:Qwen3.5-9B-AWQ-4bit与7B版本AB测试

OpenClaw模型热切换&#xff1a;Qwen3.5-9B-AWQ-4bit与7B版本AB测试 1. 为什么需要模型热切换 去年冬天&#xff0c;当我第一次尝试用OpenClaw搭建个人AI助手时&#xff0c;遇到了一个典型问题&#xff1a;处理简单图片时用9B模型太浪费&#xff0c;而复杂场景下7B模型又力不…...

Docker 从入门到实践:容器化你的应用

Docker 从入门到实践&#xff1a;容器化你的应用 在当今快速发展的软件开发领域&#xff0c;Docker 已成为一项革命性的技术&#xff0c;它通过容器化技术彻底改变了应用的开发、部署和运行方式。无论是开发者、运维工程师还是技术爱好者&#xff0c;掌握 Docker 都能显著提升…...

3步实现Figma全界面中文适配:面向设计团队的本地化解决方案

3步实现Figma全界面中文适配&#xff1a;面向设计团队的本地化解决方案 【免费下载链接】figmaCN 中文 Figma 插件&#xff0c;设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 价值定位&#xff1a;打破语言壁垒的设计效率革命 设计工具的语…...

突破VMware macOS限制:Auto-Unlocker的完整解决方案

突破VMware macOS限制&#xff1a;Auto-Unlocker的完整解决方案 【免费下载链接】auto-unlocker Unlocker for VMWare macOS 项目地址: https://gitcode.com/gh_mirrors/au/auto-unlocker 当你准备在VMware中创建macOS虚拟机时&#xff0c;却发现系统选择列表中根本没有…...

JavaScript WeakSet的has()方法:一个被低估的‘对象侦探’,5分钟搞懂它的正确用法和常见误区

JavaScript WeakSet的has()方法&#xff1a;一个被低估的‘对象侦探’&#xff0c;5分钟搞懂它的正确用法和常见误区 想象一下&#xff0c;你有一个只认人脸不认名字的侦探朋友。无论你如何描述一个人的特征&#xff0c;他只会摇头说&#xff1a;"除非让我亲眼看到这个人&…...

用C51玩转LED:从流水灯代码里,我悟出了嵌入式模块化设计的精髓

用C51玩转LED&#xff1a;从流水灯代码里&#xff0c;我悟出了嵌入式模块化设计的精髓 第一次用C51点亮LED时&#xff0c;那种成就感至今难忘。但当我尝试把简单的流水灯代码扩展成更复杂的灯光效果时&#xff0c;代码很快变成了一团乱麻——全局变量四处游走&#xff0c;延时函…...

终极指南:用OpenCore Configurator轻松搞定黑苹果引导设置

终极指南&#xff1a;用OpenCore Configurator轻松搞定黑苹果引导设置 【免费下载链接】OpenCore-Configurator A configurator for the OpenCore Bootloader 项目地址: https://gitcode.com/gh_mirrors/op/OpenCore-Configurator 还在为复杂的黑苹果引导配置而头疼吗&a…...

别死记硬背DP了!用‘斐波那契数列’和‘兔子繁殖’故事,真正理解重叠子问题与最优子结构

从兔子繁殖到算法竞赛&#xff1a;用生活故事拆解动态规划的核心思想 第一次接触动态规划&#xff08;DP&#xff09;时&#xff0c;很多人的反应都是"这太抽象了"。教科书上充斥着"最优子结构"、"重叠子问题"等专业术语&#xff0c;让人望而生畏…...