Двоичное дерево в C # - PullRequest
       0

Двоичное дерево в C #

1 голос
/ 17 декабря 2010

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            leaf root = new leaf();
            while (true)
            {
                string read = Console.ReadLine();
                if (read == "print")
                {
                    root.print();
                }
                else
                {
                    root.grow(Convert.ToInt32(Console.ReadLine()));
                }
            }
        }
    }
    class leaf
    {
        public void print()
        {

        }
        public void grow(int value)
        {
            if (isNull)
            {
                isNull = false;
                this.value = value;
                smaller = bigger = new leaf();
            }
            else
            {
                if (value > this.value)
                {
                    bigger.grow(value);
                }
                else
                {
                    smaller.grow(value);
                }
            }
        }
        public bool isNull = true;
        public int value;
        leaf smaller;
        leaf bigger;
    }
}

Проблема: Длявход: 1 2 3 4 13 6 4 7 8

Создает следующее дерево (пропускает числа, и я не знаю почему):

   2
  / \
     4
    / \
       6
      / \
         7
        / \

Ответы [ 3 ]

7 голосов
/ 17 декабря 2010

Это ваша проблема, я подозреваю:

smaller = bigger = new leaf();

Вы создали один объект и присвоили ему ссылку как для smaller, так и bigger.Поэтому вызов smaller.grow() эквивалентен вызову bigger.grow().

Попробуйте:

smaller = new leaf();
bigger = new leaf();

(В качестве примечания я бы настоятельно рекомендовал бы вамначните следовать .NET соглашениям об именах , чтобы сделать ваш код более легким для чтения другими разработчиками и более совместимым с другим кодом.)

2 голосов
/ 17 декабря 2010

Полагаю, что если бы вы точно написали, что делаете, ответ был бы более ясным.

Вы пишете, что ввод: 1 2 3 4 13 6 4 7 8, но это приведет к ничто строка:

string read = Console.ReadLine();

будет использовать его и вернуться к той же строке, ожидая ввода. Я предполагаю, что ваш фактический вклад:

1

2

3

13

6

4

7

8

, но все остальные из них будут использованы только вышеуказанной строкой 2,4,6,7 будет потребляться линией:

root.grow(Convert.ToInt32(Console.ReadLine()));

что соответствует вашему результату. изменив эту последнюю строку (после внесения изменений, которую предлагает Джон) на:

root.grow(Convert.ToInt32(read));

добьется цели (если мои предположения относительно вашего фактического ввода верны)

1 голос
/ 17 декабря 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...