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> 接口的类型。可以根据需要修改和扩展这个程序,例如,可以添加其他方法来遍历和操作二叉树。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/740068.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基础刷题50之八(数组元素积的符号)

文章目录 前言一、题目二、力扣官方解释文心一言解释总结 前言 刚上研一&#xff0c;有人劝我好好学C&#xff0c;当时用的不多就没学&#xff0c;现在毕业上班了。在此亡羊补牢了 在此感谢力扣和文心一言 一、题目 数组元素积的符号 已知函数 signFunc(x) 将会根据 x 的正负…

python读取execl里的图片

正常的读取图片 from openpyxl import load_workbook from PIL import Imagefrom openpyxl import load_workbook wb load_workbook(rC:\Users\Administrator\Downloads\output1111.xlsx) ws wb[wb.sheetnames[0]] for image in ws._images:data image.anchor._fromif image…

深耕大屏营销领域的酷开科技,为品牌方带来更多的收益

互联网作为一种新的发展趋势&#xff0c;更是为我们提供了无数的机会和无限可能性&#xff0c;从电子商务时代到社交网络时代&#xff0c;价值文化也成为了品牌与消费者之间紧密联系的关键纽带。而在此背景下&#xff0c;OTT大屏拥有着独特的优势&#xff0c;作为OTT行业内的独…

数据库三大范式设计原则

数据库三大范式 第一范式(确保每列保持原子性) 第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值&#xff0c;就说明该数据库表满足了第一范式。 第二范式(确保表中的每列都和主键相关) 第二范式在第一范式的基础之上更进一层。第二范式需要确保数据…

第十节 JDBC事务

如果JDBC连接处于自动提交模式&#xff0c;默认情况下&#xff0c;则每个SQL语句在完成后都会提交到数据库。 对于简单的应用程序可能没有问题&#xff0c;但是有三个原因需要考虑是否关闭自动提交并管理自己的事务 - 提高性能保持业务流程的完整性使用分布式事务 事务能够控…

网络工程师——2024自学

一、怎样从零开始学习网络工程师 当今社会&#xff0c;人人离不开网络。整个IT互联网行业&#xff0c;最好入门的&#xff0c;网络工程师算是一个了。 什么是网络工程师呢&#xff0c;简单来说&#xff0c;就是互联网从设计、建设到运行和维护&#xff0c;都需要网络工程师来…

03在ESP-IDF中使用C++面向对象编程

在ESP-IDF中使用C和C进行混合编译 ESP-IDF是Espressif Systems开发的官方IoT开发框架&#xff0c;用于编程和开发ESP32系列的微控制器。虽然ESP-IDF主要使用C语言编写&#xff0c;但它也支持使用C进行开发 为什么要进行混合编译&#xff1f; C是一种功能强大的编程语言&…

Win11右键菜单恢复经典样式

一、使用Cmd恢复Windows 11上的经典上下文菜单 1.使用管理员权限打开Cmd 2.复制并粘贴以下代码&#xff0c;然后按enter键 reg.exe add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f 二、使用Cmd恢复Windows 11上的默认…

Spring事务实现原理和工作原理

文章目录 Spring事务实现原理1. **事务管理器&#xff08;Transaction Manager&#xff09;**&#xff1a;2. **事务定义&#xff08;Transaction Definition&#xff09;**&#xff1a;3. **切面&#xff08;Aspect&#xff09;**&#xff1a;4. **代理对象&#xff08;Proxy&…

web中实现一个账号同一时间只能由一个人使用

实现一个账号同一时间只能由一个人使用&#xff0c;通常需要在前端和后端同时进行控制。以下是一个基本的实现方案&#xff1a; 后端实现&#xff1a; 会话管理&#xff1a; 当用户登录时&#xff0c;生成一个唯一的会话标识&#xff08;如Token或Session ID&#xff09;。将该…

Java学习笔记(十五)IO流(二)

字符流 字符流其实就是字节流字符集&#xff0c;他在遇到相关的数据时会转变为相关的字节&#xff0c;例如遇到英文就转变为一个字节&#xff0c;遇到中文转变为三个字节 FileReader&#xff08;读取数据类&#xff09; 作用&#xff1a;纯文本文件-------->程序 将纯文…

【NR 定位】3GPP NR Positioning 5G定位标准解读(十五)-UL-TDOA 定位

前言 3GPP NR Positioning 5G定位标准&#xff1a;3GPP TS 38.305 V18 3GPP 标准网址&#xff1a;Directory Listing /ftp/ 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;一&#xff09;-CSDN博客 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;…

Linux:时间指令 - cal date

Linux&#xff1a;时间指令 - cal & date date指令cal指令 date指令 date用于以指定格式显示时间 我们先看看直接输入date指令的效果&#xff1a; [hxyiZ2zehtehrgzt3wqccrpyfZ CSDN]$ date Tue Mar 12 21:38:01 CST 2024直接输入date指令&#xff0c;得到了以 星期 月 日…

C#,数值计算,解微分方程的龙格-库塔二阶方法与源代码

1 微分方程 含有导数或微分的方程称为微分方程,未知函数为一元函数的微分方程称为常微分方程。 微分方程的阶数 微分方程中导数或微分的最高阶数称为微分方程的阶数。 微分方程的解 使得微分方程成立的函数称为微分方程的解。 微分方程的特解 微分方程的不含任意常数的解称…

软考介绍的创新技术

本博客地址&#xff1a;https://security.blog.csdn.net/article/details/136632895 一. 信息物理系统 1、信息物理系统&#xff08;CPS&#xff09;通过集成先进的感知、计算、通信、控制等信息技术和自动控制技术&#xff0c;构建了物理空间与信息空间中人、机、物、环境、…

蚂蚁集团2025届暑期实习开始啦~

蚂蚁集团2025届暑期实习开始啦&#xff5e;欢迎大家投递信贷事业群-风险管理部的算法岗&#xff0c;找我内推哦&#xff5e;社招也有hc&#xff0c;欢迎大家沟通&#xff01;

LeetCode 2129.将标题首字母大写:模拟(一个变量记录是否该大写)

【LetMeFly】2129.将标题首字母大写&#xff1a;模拟&#xff08;一个变量记录是否该大写&#xff09; 力扣题目链接&#xff1a;https://leetcode.cn/problems/capitalize-the-title/ 给你一个字符串 title &#xff0c;它由单个空格连接一个或多个单词组成&#xff0c;每个…

STM32CubeIDE基础学习-STM32CubeIDE软件代码编写格式问题

STM32CubeIDE基础学习-STM32CubeIDE软件代码编写格式问题 前言 代码编写最好就是规定一个格式&#xff0c;或者建立一个偏好&#xff0c;这样写出来的代码就方便自己管理了&#xff0c;不然代码乱放下次打开工程就很难找到具体位置&#xff0c;如果规定了格式&#xff0c;那么…

Git 系列:简介安装以及配置管理

文章目录 简介安装简介Centos安装 配置管理[git help](https://www.git-scm.com/docs/git-help)概要选项示例git-doc [git config](https://www.git-scm.com/docs/git-config)概要选项变量示例 初始化配置 简介安装 简介 https://git-scm.com/ Git是一个开源的分布式版本控制…

软件测试知识面试题:测试计划关键、BUG流程、BUG描述、测试的整体覆盖率

文章目录 做好测试计划工作的关键是什么&#xff1f;公司的BUG流程是什么&#xff1f;如何提交一个好的bug&#xff1f;BUG描述包含哪些内容&#xff1f;讲述自己在项目中发现最有意义的一个 BUG&#xff0c;是什么导致出现这个问题&#xff1f;&#xff08;例子&#xff09;对…