开发者

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

目录
  • 一、涉及到的知识点
    • 1.Comparer<T>.Default 属性
    • 2.实现二叉树类BinaryTree<T>步骤
  • 二、 使用泛型节点类 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)
                        {
                            i编程客栈f (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#二叉树类的资料请关注编程客栈(www.devze.com)其它相关文章!

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜