Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> от С++ к C#, бинарное дерево 
:(
    Опции темы
ZuTa
Дата 2.3.2011, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 3.6.2009

Репутация: нет
Всего: нет



Здравствуйте!

Подскажите, пожалуйста, как реализовать бинарное дерево в C# ?
Например в С++ можно написать такую структуру :
Код

struct node
{
int n; 
node *left;
node *right; 
}


PM MAIL WWW   Вверх
Экскалупатор
Дата 2.3.2011, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



ZuTa, точно так же. только без "*". и не struct а class.
Код

public class node
    {
        public int n;
        public node left;
        public node right;
    }


но это не серьезно, надо что бы все поля были скрытыми, доступ к ним через свойства/методы... и прочие штуки что бы код стал безопаснее и кошернее.
PM MAIL ICQ   Вверх
ZuTa
Дата 2.3.2011, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 3.6.2009

Репутация: нет
Всего: нет



Спасибо!
Учту ваши пожелания smile 
PM MAIL WWW   Вверх
ZuTa
Дата 2.3.2011, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 3.6.2009

Репутация: нет
Всего: нет



Экскалупатор, 

Код

class Node
    {
        #region Fields
        private int n;
        private Node left;
        private Node right;
        private Node level;
        #endregion

        #region Properties
        public int N
        {
            get { return n; }
            set { n = value; }
        }
        public Node Left
        {
            get { return left; }
            set { left = value; }
        }
        public Node Right
        {
            get { return right; }
            set { right = value; }
        }

        public Node Level
        {
            get { return level; }
            set { level = value; }
        }

        #endregion

        #region Contructors
        public Node()
        {
            n = 0;
            left = null;
            right = null;
            level = null;
        }
        public Node(int n)
        {
            this.n = n;
            left = null;
            right = null;
            level = null;
        }
        #endregion

        #region Methods
        #endregion
    }


PM MAIL WWW   Вверх
Экскалупатор
Дата 2.3.2011, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



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

Добавлено через 10 минут и 11 секунд
и еще.
на мой взгляд совершенно лишним является конструктор без параметров. потому что очевидно что узел дерева не может не содержать значения, а делать много узлов со значением 0 не имеет смысла(но это имхо). ну и не совсем понятно назначение Node Level. это уровень чего? и почему там храниться ссылка на какой то узел?
PM MAIL ICQ   Вверх
ZuTa
Дата 2.3.2011, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 3.6.2009

Репутация: нет
Всего: нет



Экскалупатор, та я писал функцию для уже готового бинарного дерева (т.е. я не заботился о том как и куда добавлять - это делали другие).

На счет, конкруктора без параметров, согласен. 
А level - это уже особенность моей задачи. 

Но у меня возник вопрос : а как посчитать сколько памяти используется если задано дерево с грубиной T и N узлами ?(например, для С++ структуры, которую я написал в первом посте)

Добавлено через 13 минут и 6 секунд
Код

struct node
{
    int n;            
    node *left;        
    node *right;    
};


Читал когда-то, что указатель в памяти занимает 4 байта
Если это правда, значит структура будет занимать 3*4=12 байтов

правильно ли это ?
PM MAIL WWW   Вверх
jonie
Дата 3.3.2011, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



Цитата(ZuTa @  2.3.2011,  23:18 Найти цитируемый пост)

Читал когда-то, что указатель в памяти занимает 4 байта
Если это правда, значит структура будет занимать 3*4=12 байтов

указатель занимает в памяти не меньше sizeof(void*). Может больше - например указатели на функцию-член класса.. В стандарте С++ не определен размер указателя - зависит от архитектуры.

И размер структуры будет sizeof(node). Т.к. в мире c++ существует выравнивание данных, что регулируется компилятором, если не задано явно используя #pragma pack(XXX)

Аналогично, можно используя sizeof() в C# (в unsafe части кода) прикинуть размер... но всё это лишь приблизительная оценка будет. На самом деле сколько занимать памяти будет класс или структура никто не скажет.

Это сообщение отредактировал(а) jonie - 3.3.2011, 08:32


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Экскалупатор
Дата 3.3.2011, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



не совсем. есть же еще ссылка на саму структуру, плюс методы если они есть(конструктор, деструктор и пр.) тоже занимают место, но они обычно создаются в одном экземпляре на все объекты классов. в шарпе еще больше, там ссылка размещается в стеке + в куче выделяется память под все элементы класса + служебная информация.
Цитата(ZuTa @  2.3.2011,  22:18 Найти цитируемый пост)
Читал когда-то, что указатель в памяти занимает 4 байта

в 32-битной ОС да.


Цитата(ZuTa @  2.3.2011,  22:18 Найти цитируемый пост)
та я писал функцию для уже готового бинарного дерева

а мне показалось что мы обсуждаем именно само дерево а не работу с ним, по крайней мере весь код это само дерево, и никаких функций не было еще...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0472 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.