C# 二叉树,最大值和最小值

C# Binary Tree, Max and Min Value

我写了一些代码并遇到了一些问题,但最重要的问题是:为什么数组不能与 AddNode 一起工作?我知道我即将解决这个问题,但我希望得到一点提示。

下一个问题:Min 和 Max 值的代码很好。如何将它移动到 Class 节点?

最后一个问题:如何制作 Class 树的深度?

class Node
{
    public Node LeftNode { get; set; }
    public Node MiddleNode { get; set; }
    public Node RightNode { get; set; }

    public int Value { get; set; }

    public void AddNode(int value)
    {
        if (value < this.Value)
        {
            if (LeftNode != null)
            {
                LeftNode.AddNode(value);
                return;
            }
            LeftNode = new Node(value);
            return;
        }

        if (value > Value)
        {
            if (RightNode != null)
            {
                RightNode.AddNode(value);
                return;
            }
            RightNode = new Node(value);
            return;
        }

        if (MiddleNode != null)
        {
            MiddleNode.AddNode(value);
            return;
        }
        MiddleNode = new Node(value);
    }

    public Node(int value)
    {
        this.Value = value;
    }

    public override string ToString()
    {
        return $"Value: {Value}";
    }

    public string SortedString(Array arr)
    {
       Array.Sort(arr);
       foreach (int val in arr)
       {
           Console.WriteLine(val);
       }
       return "";
    }

    public int ValueCount(int value)
    {
        if (value < Value)
        {
            if (LeftNode == null)
            {
                return -1;
            }
            return LeftNode.ValueCount(value);
        }

        if (value > Value)
        {
            if (RightNode == null)
            {
                return -1;
            }
            return RightNode.ValueCount(value);
        }

        if (MiddleNode != null)
        {
            return 1 + MiddleNode.ValueCount(value);
        }
        return 1;
    }

    internal int Next(int min, int max)
    {
        Random rnd = new Random();
        return rnd.Next(min, max);
    }
}
class Program
{
    static void Main(string[] args)
    {

        var arr = new int[1000];
        var rnd = new Node(1);
        for (int i = 0; i < arr.Length; i++)
        {
            rnd.AddNode(arr[i]);
            //Console.WriteLine(arr[i]);
        }
        for(int i = 0; i < arr.Length; i++)
        {
            arr[i] = rnd.Next(1, 100);
            Console.WriteLine(arr[i]);
        }
        min = arr[0];
        max = arr[0];
        for (int i = 1; i < arr.Length; i++)
        {
            if (min > arr[i])
                min = arr[i];
            if (max < arr[i])
                max = arr[i];
        }
        Console.WriteLine("największa liczba" + " " + max);
        Console.WriteLine("najmniejsza liczba" + " " + min);

        Array.Sort(arr);
        foreach (int value in arr)
        {
            Console.WriteLine(value);
        }

        Console.WriteLine(rnd.ValueCount(6));
        Console.WriteLine(rnd.ToString());

    }
}

老实说 - 您的代码有点混乱。 首先 - 为什么你有一个指向中间节点的指针(ref)?二叉树定义每个节点最多有 2 个子节点(左 \ 右)。 如果您希望处理重复值,您可以选择一种策略来定义其中一个子节点也包含等于,或者更好地使用引用计数(例如:每个节点都有一个值和一个计数器来表示该值)。 re Min \ Max - 如果你的树是 BST(看起来是这种情况),你可以通过简单的树遍历向左(对于最小值)或向右(对于最大值)轻松地实现这一点。