Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Бинарное дерево на C#

23K
12 марта 2007 года
nonick
7 / / 22.02.2007
Возможно, в этой категории это уже заезженая тема но всетаки, в тех темах которые я здесь прочитал, не нашел ответы на свои вопросы. Посему решаюсь задать множество своих вопросов в новой теме.

Типа. ТЗ.
  1. Есть абстрактный класс Sotrudnik, в нем обявляем перменные Name, Age, и абстрактную функцию Show().
  2. Класс Rabotnik. Наследуемся от Sotrudnik добавляем зарплату salary и реализовываем Show().
  3. Класс Boss наследуемся от Rabotnik, добавляем начальник какого отдела Deport, реализовываем Show().
  4. Класс myTreeEl, хранит Созданую персону (Работник или Бос), и два элемента самого себя elemL и elemR которые хранят Потомков данной персоны.
  5. Класс myTree в котором реализованы методы GetLeft(), GetRiht(), AddPerson() (в AddPeron() было много изминений и переработок, возможно даже правильных сейчас уже точно сказать трудно, но так как не была реализована правильно функция отображения персон ShowPerson(), не смог окончательно устаканиься на какой либо реализации и оставил последнюю, насколько она хороша, трудно сказать.)

При добавлении новой Персоны в Дерево сортировка происходит по возрасту.

=========================================================

Теорию вроде понимаю, даже можно сказать понимаю.
Но вот реализация не получаеться по одной простой причине не могу, грубо говоря "пощупать" что навоял, отображение не фунциклирует.

Помогите реализовать для этого кода функцию ShowPerson()? чтобы я попытался сам расхлебать эту кашу.

Если AddPerson() категорически ошибочна, сообщите буду переписывать.
Код:
using System;

namespace project
{
    abstract class Sotrudnik
    {
        string name;
        public string Name // свойства переменной name
        {
            get
            {
             if (name != "")
                return name;
              else
               return "Инкогнито";
            }

            set
            {
                if (value != "")
                    name = value;
            }
        }

        int age;

        public int Age // свойства переменной age
        {
            get
            {
                return age;
            }

            set
            {
                if (value <= 0 || value >= 99)
                    throw new System.ArgumentException("Ошибка ввода возраста.");
                age = value;
            }
        }

        public Sotrudnik(string N, int A) // Конструктор с параметрами  
        {
            this.Name = N;
            try
            {
                this.Age = A;
            }
            catch (System.Exception e)
            { Console.WriteLine(e.Message); }
        }
       
        abstract public void Show(); // Абстрактная функция отображения Sotrudnik
    }

    class Rabotnik : Sotrudnik      // Наследуемся от Sotrudnik    
    {
        public int salary;

        public Rabotnik(string N, int A, int S)
            : base(N, A) // Передаем в Sotrudnik имя и возраст
        {
            this.salary = S;
        }

        override public void Show()
        {
            Console.WriteLine("Имя: {0},\nВозраст: {1},\nЗарплата: {2},\n", Name, Age, salary);
        }

    }

    class Boss : Rabotnik     // Наследуемся от Rabotnik
    {
        public string Deport;

        public Boss(string N, int A, int S, string D)
            : base(N, A, S)// Передаем в Sotrudnik имя и возраст, а в Rabotnik зарплату
        {
            this.Deport = D;
        }
        override public void Show()
        {
            Console.WriteLine("Имя: {0},\nВозраст: {1},\nНачальник {2} отдела,\nЗарплата: {3},\n", Name, Age, Deport, salary);
        }
    }

    class myTreeEl    // Класс содержит экземпляр Персоны и два экземпляра самого себя в которых храняться левый и правй элемент дерева(персоны)
    {
        public Sotrudnik Person;  // Собственно Работник или Босс
        public myTreeEl elemL;    
        public myTreeEl elemR;
 
        public myTreeEl()
        {
            this.Person = null;
            this.elemL = null;
            this.elemR = null;
        }

        public myTreeEl(Sotrudnik P)  
        {
            this.Person = P;
            this.elemL = null;
            this.elemR = null;
         }
    }

    class myTree
    {
        myTreeEl root;   // по идее сдесь будет храниться корень дерева

        public myTree()
        {
            root = null; // изначально нулевое    
        }

        public myTreeEl GetLeft(myTreeEl P) /*думаю должна вернуть левый лист дерева передаваемой Персоны*/
        {
            if(P!=null)
            {
                while(P.elemL!=null)
                    P = P.elemL;
            }
            return P;
        }

        public myTreeEl GetRight(myTreeEl P) /*тоже и с правым */
        {
            if (P != null)
            {
                while (P.elemR != null)
                    P = P.elemR;
            }
            return P;
        }
        /*Вся сортировка во врямя добавления и в дальнейшем происходит по возрасту Персоны*/
        public void AddPerson(ref myTreeEl P) /*Добавляем Персону*/
        {
            /*Дополнительный временый экземпляр елементов*/
            myTreeEl temp = null;
            /*если входящая персоа не имеет потомков делаем её корнем*/
            if (P.elemL == null && P.elemR == null)
            {
                root = P;
            }

            temp = root;
           
            if (P.Person.Age <= root.Person.Age) // если добавляемая Персона моложе корня то..
            {
                while(temp.elemL != null) //и левый потомок корня не пустой...
                {
                    temp = GetLeft(temp.elemL); //достаем левого потомка..
                }
                temp.elemL = P; // и присваиваем ему добавляемую персону.
            }
            else {   // в противном случае проделываем тоже с правым потомком
                while (temp.elemR != null)
                {
                    temp = GetRight(P);
                }
                temp.elemR = P;
            }
                       
        }

        public void ShowPerson(myTreeEl P) /*хотелосьбы посмотреть на то как отсортировано дерево*/
        {
            while (P != null) //если  персона существует
            {
                    //P = P.elemL;
                    //P.Person.Show();
                    //P = P.elemR;
                    //P.Person.Show();
                    // С этим явно проблемы нужно попробовать передавать не персону а root
            }

        }
    }

    class myClass
    {

        static void Main(string[] args)
        {
            //Собственно здесь и создаем дерево и добавляем персоны
            string name;
            int A;
            int salary;
            string dep;
            bool flag = false;
            myTreeEl myT;
            myTree t = new myTree();
           
            do
            {
                Rabotnik rab;
                Boss bos;
                Console.WriteLine("Введите имя сотрудника:\n");
                name = Console.ReadLine();
                Console.WriteLine("Введите возраст сотрудник:\n");
                A = Convert.ToInt32(Console.ReadLine());      
                Console.WriteLine("Введите сумму зарплаты сотрудника");
                salary = Convert.ToInt32(Console.ReadLine());
                Console.WriteLine("Сотрудник начальник? - \tДа/Нет.\n");
                string temp = Console.ReadLine();
                temp = temp.ToLower();
               
                if (temp == "да") // если Работник Начальник вводим название отдела
                {
                    Console.WriteLine("Введите занимаемую должность.\n");
                    dep = Console.ReadLine();
                    bos = new Boss(name, A, salary, dep); //Создаем босса
                    myT = new myTreeEl(bos); //Создаем елемент персона
                   
                }
                else
                {
                    rab = new Rabotnik(name, A, salary); //Тоже если Работник не начальник
                    myT = new myTreeEl(rab);
                   
                }
                t.AddPerson(ref myT); //Передаем новую персону в Дерево
                Console.WriteLine("Хотите продолжить? \tДа/Нет.\n");
                temp = Console.ReadLine();
                temp = temp.ToLower();
                if (temp != "да")
                    flag = true;

            } while (!flag);

            //пока все отображения дерева нет.
            t.ShowPerson(myT);

        }
    }
}
74K
01 декабря 2011 года
Goldcoding
9 / / 08.10.2011
Много кода, думаю мало кто поможет. Для отображения могу посоветовать перенести приложение в Windows Forms и использовать контрол TreeView, он наглядней покажет что есть что..вот как я делал в своей программе при работе с двоичными деревьями.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог