C # Как я могу запустить эту программу?Проблема с массивом - PullRequest
0 голосов
/ 19 октября 2018

Я должен получить выходные данные порядка обхода InOrder, PreOrder и PostOrder бинарного дерева поиска.я просто не могу понять, как запустить эту программу с помощью массива.

class Node
{
    public int[] item = new int[11];
    public Node left;
    public Node right;
    public void display()
    {
        Console.Write("[");
        Console.Write(item);
        Console.Write("]");
    }
}

class Tree
{
    public Node root;

    public Tree()
    {
        root = null;
    }

    public Node Returnroot()
    {
        return root;
    }

    public void Insert(int id)
    {
        Node newnode = new Node();
        newnode.item[11] = id;
        if (root == null)
            root = newnode;
        else
        {
            Node current = root;
            Node parent;
            while (true)
            {
                parent = current;
                if (id < current.item[11])
                {
                    current = current.left;
                        if (current == null)
                        {
                            parent.left = newnode;
                            return;
                        }
                }
                else
                {
                    current = current.right;
                    if (current == null)
                    {
                        parent.right = newnode;
                        return;
                    }
                }
            }
        }
    }

    public void Inorder(Node Root)
    {
        if (Root != null)
        {
            Inorder(Root.left);
            Console.WriteLine(Root.item[11] + " ");
            Inorder(Root.right);
        }
    }

    public void Preorder(Node Root)
    {
        if (Root != null)
        {
            Console.WriteLine(Root.item[11] + " ");
            Preorder(Root.left);
            Preorder(Root.right);
        }
    }

    public void Postorder(Node Root)
    {
        if (Root != null)
        {
            Postorder(Root.left);
            Postorder(Root.right);
            Console.WriteLine(Root.item[11] + " ");
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        Tree BST = new Tree();
        BST.Insert(30);
        BST.Insert(35);
        BST.Insert(57);
        BST.Insert(15);
        BST.Insert(63);
        BST.Insert(49);
        BST.Insert(89);
        BST.Insert(77);
        BST.Insert(67);
        BST.Insert(98);
        BST.Insert(91);
        Console.WriteLine("inOrder Traversal :  ");
        BST.Inorder(BST.Returnroot());
        Console.WriteLine("  ");
        Console.WriteLine();
        Console.WriteLine("PreOrder Traversal :  ");
        BST.Preorder(BST.Returnroot());
        Console.WriteLine("  ");
        Console.WriteLine();
        Console.WriteLine("PostOrder Traversal :  ");
        BST.Postorder(BST.Returnroot());
        Console.WriteLine("  ");
        Console.WriteLine();

        Console.ReadKey();
    }
}

мой вопрос состоит в том, как запустить этот код с помощью массива, для меня это очень сложно, я пробовал много способов заставить это работатьвсе еще не работает.я обычно получаю ошибку массива из отказов.так, может, как я поставил массив неправильно?Как мне объявить массив в этой программе?

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Как я уже говорил в моих комментариях, массивы C # основаны на 0.
Это означает, что когда вы объявляете массив как

int[] item = new int[11];

, его 11-й элемент равен item[10], а item[11] выходит за пределы.

Замена всех ваших попыток достижения item[11] на item[10] приводит к:

using System.IO;
using System;

class Node
{
    public int[] item = new int[11];
    public Node left;
    public Node right;
    public void display()
    {
        Console.Write("[");
        Console.Write(item);
        Console.Write("]");
    }
}

class Tree
{
    public Node root;

    public Tree()
    {
        root = null;
    }

    public Node Returnroot()
    {
        return root;
    }

    public void Insert(int id)
    {
        Node newnode = new Node();
        newnode.item[10] = id; // HERE (1/5)
        if (root == null)
            root = newnode;
        else
        {
            Node current = root;
            Node parent;
            while (true)
            {
                parent = current;
                if (id < current.item[10]) // HERE (2/5)
                {
                    current = current.left;
                        if (current == null)
                        {
                            parent.left = newnode;
                            return;
                        }
                }
                else
                {
                    current = current.right;
                    if (current == null)
                    {
                        parent.right = newnode;
                        return;
                    }
                }
            }
        }
    }

    public void Inorder(Node Root)
    {
        if (Root != null)
        {
            Inorder(Root.left);
            Console.WriteLine(Root.item[10] + " "); // HERE (3/5)
            Inorder(Root.right);
        }
    }

    public void Preorder(Node Root)
    {
        if (Root != null)
        {
            Console.WriteLine(Root.item[10] + " "); // HERE (4/5)
            Preorder(Root.left);
            Preorder(Root.right);
        }
    }

    public void Postorder(Node Root)
    {
        if (Root != null)
        {
            Postorder(Root.left);
            Postorder(Root.right);
            Console.WriteLine(Root.item[10] + " "); // HERE (5/5)
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        Tree BST = new Tree();
        BST.Insert(30);
        BST.Insert(35);
        BST.Insert(57);
        BST.Insert(15);
        BST.Insert(63);
        BST.Insert(49);
        BST.Insert(89);
        BST.Insert(77);
        BST.Insert(67);
        BST.Insert(98);
        BST.Insert(91);
        Console.WriteLine("inOrder Traversal :  ");
        BST.Inorder(BST.Returnroot());
        Console.WriteLine("  ");
        Console.WriteLine();
        Console.WriteLine("PreOrder Traversal :  ");
        BST.Preorder(BST.Returnroot());
        Console.WriteLine("  ");
        Console.WriteLine();
        Console.WriteLine("PostOrder Traversal :  ");
        BST.Postorder(BST.Returnroot());
        Console.WriteLine("  ");
        Console.WriteLine();

        Console.ReadKey();
    }
}

Вывод на вывод:

inOrder Traversal :  
15 
30 
35 
49 
57 
63 
67 
77 
89 
91 
98 


PreOrder Traversal :  
30 
15 
35 
57 
49 
63 
89 
77 
67 
98 
91 


PostOrder Traversal :  
15 
49 
67 
77 
91 
98 
89 
63 
57 
35 
30 

Здесь нет исключений.

0 голосов
/ 19 октября 2018

Вы получили ошибку System.IndexOutOfRangeException в классе Tree, в методе Insert (строка 39).Вы пытаетесь поместить идентификатор в 12-й элемент массива newnode.item (newnode.item[11] = id;), но массив newnode.item имеет размер только для 11-го элемента.Если вы хотите поместить этот идентификатор в качестве 11-го элемента, тогда вы должны поместить newnode.item[10] = id;, потому что индекс элемента массива отсчитывает от 0 до n, а не от 1 до n.

Вы должны изменить someArray.item[11] наsomeArray.item[10] в вашем полном коде.

Но если вы хотите ввести newnode.item[11], вам нужно изменить класс Node с public int[] item = new int[11]; на public int[] item = new int[12];

...