C#使用自定义的泛型节点类实现二叉树类

 更新时间:2024年03月10日 08:53:01   作者:wenchm  
这篇文章主要为大家详细介绍了C#如何使用自定义的泛型节点类 Node<T>实现二叉树类BinaryTree<T>及其方法,感兴趣的小伙伴可以跟随小编一起学习一下

一、涉及到的知识点

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#使用自定义的泛型节点类实现二叉树类的详细内容,更多关于C#二叉树类的资料请关注脚本之家其它相关文章!

相关文章

  • C#实现用户自定义控件中嵌入自己的图标

    C#实现用户自定义控件中嵌入自己的图标

    这篇文章主要介绍了C#实现用户自定义控件中嵌入自己的图标,较为详细的分析了C#实现自定义控件中嵌入图标的具体步骤与相关实现技巧,需要的朋友可以参考下
    2016-03-03
  • C# WinForm控件对透明图片重叠时出现图片不透明的简单解决方法

    C# WinForm控件对透明图片重叠时出现图片不透明的简单解决方法

    这篇文章主要介绍了C# WinForm控件对透明图片重叠时出现图片不透明的简单解决方法,结合实例形式分析了WinForm图片重叠后造成图片不透明的原因与相应的解决方法,需要的朋友可以参考下
    2016-06-06
  • C#利用控件拖拽技术制作拼图游戏

    C#利用控件拖拽技术制作拼图游戏

    这篇文章主要介绍了C#利用控件拖拽技术制作拼图游戏的方法以及核心代码,需要的朋友可以参考下
    2015-06-06
  • 详解WPF如何在基础控件上显示Loading等待动画

    详解WPF如何在基础控件上显示Loading等待动画

    这篇文章主要为大家详细介绍了WPF如何在基础控件上显示Loading等待动画的效果,文中的示例代码讲解详细,具有一定的学习价值,需要的可以参考一下
    2023-04-04
  • C#使用Spire.XLS for .NET将Markdown转换为PDF和Excel的完整指南

    C#使用Spire.XLS for .NET将Markdown转换为PDF和Excel的完整指南

    在当今数字化的世界中,Markdown已成为开发者、作者和内容创作者的首选标记语言,然而,当我们需要将这些内容进行分发、归档或进行数据分析时,Markdown的纯文本格式便显得力不从心了,本文将深入探讨如何在C# .NET环境中将Markdown内容转换为PDF和Excel格式
    2025-12-12
  • C#实现把txt文本数据快速读取到excel中

    C#实现把txt文本数据快速读取到excel中

    这篇文章主要介绍了C#实现把txt文本数据快速读取到excel中,本文直接给出示例代码,需要的朋友可以参考下
    2015-06-06
  • WinForm程序实现在线更新软件功能的具体步骤

    WinForm程序实现在线更新软件功能的具体步骤

    本文详细介绍了WinForm程序LWH.exe实现远程升级的步骤:通过FTP服务器存放更新包,对比版本号后下载解压替换文件,利用独立更新工具完成升级,实现软件在线更新功能,需要的朋友可以参考下
    2025-05-05
  • WPF自动隐藏的消息框的实例代码

    WPF自动隐藏的消息框的实例代码

    本文给大家介绍WPF自动隐藏的消息框实例代码,当鼠标放上去将一直显示,移开动画继续,提供normal和error两种边框。非常不错,具有参考借鉴价值,感兴趣的朋友一起看下吧
    2016-07-07
  • C#实现六大设计原则之里氏替换原则

    C#实现六大设计原则之里氏替换原则

    这篇文章介绍了C#实现六大设计原则之里氏替换原则的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-02-02
  • C# 在PDF中添加墨迹注释Ink Annotation的步骤详解

    C# 在PDF中添加墨迹注释Ink Annotation的步骤详解

    PDF中的墨迹注释表现为徒手涂鸦式的形状,该类型的注释,可任意指定形状顶点的位置及个数,通过指定的顶点,程序将连接各点绘制成平滑的曲线,下面通过C#程序代码介绍下在pdf中添加注释的步骤,感兴趣的朋友一起看看吧
    2022-02-02

最新评论