繁体   English   中英

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

[英]C# Binary Tree, Max and Min Value

我写了一段代码,但遇到了一些问题,但最重要的问题是....为什么数组不能与 AddNode 一起使用。 我知道我即将解决这个问题,但我希望得到一点提示。 下一个问题。 最小值和最大值的代码很好,我如何将其移动到 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个孩子(左\右)。 如果您希望处理重复值,您可以选择一种策略,将其中一个子项定义为也包含 equals,或者更好地使用 ref count(例如:每个节点都有一个值和该值的计数器)。 re Min \ Max - 如果您的树是 BST(似乎是这种情况),您可以通过简单的树遍历来轻松实现这一点,无论是向左(对于最小值)还是向右(对于最大值)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM