C#使用自定義的泛型節(jié)點類實現(xiàn)二叉樹類
一、涉及到的知識點
1.Comparer<T>.Default 屬性
返回由泛型參數(shù)指定的類型的默認(rèn)排序順序比較器。
public static System.Collections.Generic.Comparer<T> Default { get; }
屬性值
Comparer<T>
繼承 Comparer<T> 并作為 T 類型的排序順序比較器的對象。
Comparer<T>.Default 屬性是 C# 中 System.Collections.Generic命名空間下的一個屬性。它返回一個 Comparer<T> 對象的默認(rèn)實例,該對象可以對泛型集合中的對象進(jìn)行比較。默認(rèn)情況下,這個比較器根據(jù)對象的自然順序進(jìn)行比較,即通過調(diào)用對象的 CompareTo 方法進(jìn)行比較。
// 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];
// 使用默認(rèn)比較器對集合進(jìn)行排序
numbers.Sort(Comparer<int>.Default);
Console.WriteLine(string.Join(", ", numbers));
}
}
}
//運行結(jié)果:
/*
1, 2, 3, 4
*/
在這個例子中創(chuàng)建了一個包含整數(shù)的列表。然后,使用 Comparer<int>.Default 屬性提供的默認(rèn)比較器對列表進(jìn)行排序。最后,輸出排序后的列表,可以看到數(shù)字已經(jīng)按照升序排列。
2.實現(xiàn)二叉樹類BinaryTree<T>步驟
(1)先設(shè)計一個泛型節(jié)點類
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)再設(shè)計一個泛型的二叉樹類
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)最后設(shè)計Main方法
定義一個二叉樹類的對象,引用類中的方法。
BinaryTree<int> tree = new();
二、 使用泛型節(jié)點類 Node<T>實現(xiàn)二叉樹類BinaryTree<T>
// 使用泛型節(jié)點類 Node<T>設(shè)計實現(xiàn)二叉樹類
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);
}
}
}
}
運行結(jié)果:
中序遍歷:
1
3
4
5
7
8
前序遍歷:
5
3
1
4
8
7
后序遍歷:
1
4
3
7
8
5
在這個實例中使用 Comparer<T>.Default 來比較兩個值的大小。這個方法適用于任何實現(xiàn)了 System.IComparable<T> 接口的類型,因此可以使用任何實現(xiàn)了該接口的值類型或引用類型。
這個程序的主要功能是添加一個新的節(jié)點到二叉樹中。它首先檢查根節(jié)點是否為空,如果為空,則將新的節(jié)點設(shè)置為根節(jié)點。否則,它將從根節(jié)點開始,遞歸地遍歷二叉樹,找到合適的位置插入新的節(jié)點。
這個程序的實現(xiàn)是正確的,它可以用于存儲和操作實現(xiàn)了 System.IComparable<T> 接口的類型??梢愿鶕?jù)需要修改和擴展這個程序,例如,可以添加其他方法來遍歷和操作二叉樹。
以上就是C#使用自定義的泛型節(jié)點類實現(xiàn)二叉樹類的詳細(xì)內(nèi)容,更多關(guān)于C#二叉樹類的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#實現(xiàn)用戶自定義控件中嵌入自己的圖標(biāo)
這篇文章主要介紹了C#實現(xiàn)用戶自定義控件中嵌入自己的圖標(biāo),較為詳細(xì)的分析了C#實現(xiàn)自定義控件中嵌入圖標(biāo)的具體步驟與相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2016-03-03
C# WinForm控件對透明圖片重疊時出現(xiàn)圖片不透明的簡單解決方法
這篇文章主要介紹了C# WinForm控件對透明圖片重疊時出現(xiàn)圖片不透明的簡單解決方法,結(jié)合實例形式分析了WinForm圖片重疊后造成圖片不透明的原因與相應(yīng)的解決方法,需要的朋友可以參考下2016-06-06
詳解WPF如何在基礎(chǔ)控件上顯示Loading等待動畫
這篇文章主要為大家詳細(xì)介紹了WPF如何在基礎(chǔ)控件上顯示Loading等待動畫的效果,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,需要的可以參考一下2023-04-04
C#使用Spire.XLS for .NET將Markdown轉(zhuǎn)換為PDF和Excel的完整指南
在當(dāng)今數(shù)字化的世界中,Markdown已成為開發(fā)者、作者和內(nèi)容創(chuàng)作者的首選標(biāo)記語言,然而,當(dāng)我們需要將這些內(nèi)容進(jìn)行分發(fā)、歸檔或進(jìn)行數(shù)據(jù)分析時,Markdown的純文本格式便顯得力不從心了,本文將深入探討如何在C# .NET環(huán)境中將Markdown內(nèi)容轉(zhuǎn)換為PDF和Excel格式2025-12-12
C#實現(xiàn)把txt文本數(shù)據(jù)快速讀取到excel中
這篇文章主要介紹了C#實現(xiàn)把txt文本數(shù)據(jù)快速讀取到excel中,本文直接給出示例代碼,需要的朋友可以參考下2015-06-06
WinForm程序?qū)崿F(xiàn)在線更新軟件功能的具體步驟
本文詳細(xì)介紹了WinForm程序LWH.exe實現(xiàn)遠(yuǎn)程升級的步驟:通過FTP服務(wù)器存放更新包,對比版本號后下載解壓替換文件,利用獨立更新工具完成升級,實現(xiàn)軟件在線更新功能,需要的朋友可以參考下2025-05-05
C#?在PDF中添加墨跡注釋Ink?Annotation的步驟詳解
PDF中的墨跡注釋表現(xiàn)為徒手涂鴉式的形狀,該類型的注釋,可任意指定形狀頂點的位置及個數(shù),通過指定的頂點,程序?qū)⑦B接各點繪制成平滑的曲線,下面通過C#程序代碼介紹下在pdf中添加注釋的步驟,感興趣的朋友一起看看吧2022-02-02

