C#使用自定義的泛型節(jié)點類實現(xiàn)二叉樹類
一、涉及到的知識點
1.Comparer<T>.Default 屬性
返回由泛型參數(shù)指定的類型的默認排序順序比較器。
public static System.Collections.Generic.Comparer<T> Default { get; }
屬性值
Comparer<T>
繼承 Comparer<T> 并作為 T 類型的排序順序比較器的對象。
Comparer<T>.Default 屬性是 C# 中 System.Collections.Generic命名空間下的一個屬性。它返回一個 Comparer<T> 對象的默認實例,該對象可以對泛型集合中的對象進行比較。默認情況下,這個比較器根據(jù)對象的自然順序進行比較,即通過調(diào)用對象的 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)); } } } //運行結(jié)果: /* 1, 2, 3, 4 */
在這個例子中創(chuàng)建了一個包含整數(shù)的列表。然后,使用 Comparer<int>.Default 屬性提供的默認比較器對列表進行排序。最后,輸出排序后的列表,可以看到數(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)二叉樹類的詳細內(nèi)容,更多關(guān)于C#二叉樹類的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#日期時間類的使用方法(DateTime類、TimeSpan類與DateTimeOffset類)
在C#中我們常使用到關(guān)于時間的相關(guān)操作,這篇文章主要給大家介紹了關(guān)于C#日期時間類的使用方法,文中介紹的方法分別包括DateTime類、TimeSpan類與DateTimeOffset類的相關(guān)資料,需要的朋友可以參考下2023-11-11