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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Деревья "высаживаю" ... бинарные деревья в С# 
:(
    Опции темы
lioness
Дата 11.8.2006, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Взяла статью http://msdn.microsoft.com/vcsharp/programm...uctures20_3.asp 
(обязательно нужна универсальность <T>, использую Visual Studio 2005)

Повторила, что в статье напИсано:

класс узла =>   списка узлов =>   узлов дерева    => дерево создать
        Node          NodeList            BinaryTreeNode        BinaryTree

Все отдельные классы.  Начинается с Form1, хотя в VS 2005 там сразу ТРИ класса создаются partial Form1, partial Form1.Designer и еще  Program с Main-классом.

А вот дальше по тексту статьи, я просто не знаю (неопытная я  smile )  как организовать работу вот этого куска
Код

BinaryTree<int> btree = new BinaryTree<int>();
btree.Root = new BinaryTreeNode<int>(1);
btree.Root.Left = new BinaryTreeNode<int>(2);
btree.Root.Right = new BinaryTreeNode<int>(3);

btree.Root.Left.Left = new BinaryTreeNode<int>(4);
btree.Root.Right.Right = new BinaryTreeNode<int>(5);

btree.Root.Left.Left.Right = new BinaryTreeNode<int>(6);
btree.Root.Right.Right.Right = new BinaryTreeNode<int>(7);

btree.Root.Right.Right.Right.Right = new BinaryTreeNode<int>(8);



Я сделала еще один класс TestingBinaryTree  и туда этот кусочек включила. Все без ошибок пробегает, но я ведь как-то хочу реагировать на данные, что стоят в узлах. Попыталась простыми линиями изобразить построение дерева,  НО (!!!)  графика вообще не работает в этом классе. Graphics даже в подсказке в TestingBinaryTree отсутствует. Рисовать могу только в Form1.  Но что-то я никак не могу передать информацию от дерева из TestingBinaryTree в Form1. Например бы мне, дорисовывать по одной линии после каждого узла. 

Принципиально как мне поступить, что data в каждом Node была мне доступна постоянно там, где я могу, например, добавлять графику.  smile  smile  smile 
PM MAIL   Вверх
Sartorius
Дата 11.8.2006, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

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



 Интересно ребята из microsoft деревья без рекурсии строят smile . Насчет графики, передай своему классу TestingBinaryTree нормальный Graphics от какой нить формы.
PM MAIL ICQ   Вверх
lioness
Дата 11.8.2006, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Передала переменную. В Form1 после строки с инициализацией 

            InitializeComponent();
            Graphics g = CreateGraphics();
            TestBinaryTree tbt = new TestBinaryTree(g);

Он НЕ рисует. Вощщее.  Я прохожу с отладчиком внутри TestBinaryTree по строкам с LineDraw, но эффекта - нуль.

Рисовать он хочет явно из Paint. Я понимаю, что это идеологически правильно. Но как мне "tbt", которое я делаю new в Form1 дотащить до Form1_Paint, чтобы я пробежалась по всему дереву, которое только что создала????
PM MAIL   Вверх
Naum
Дата 11.8.2006, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

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



Код

 Graphics g=Graphics.FromHwnd(MyBase.Handle);



--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
mr.DUDA
Дата 11.8.2006, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



lioness, дай код класса TestBinaryTree


--------------------
user posted image
PM MAIL WWW   Вверх
Naum
Дата 11.8.2006, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

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



Млин, спутал с VB.

Код

 Graphics g=Graphics.FromHwnd(this.Handle);



Цитата(lioness @  11.8.2006,  11:13 Найти цитируемый пост)
Рисовать он хочет явно из Paint. Я понимаю, что это идеологически правильно.


По-моему это имеет значение, только если нужно быстро перерисовывать довольно большие области. В твоем же случае, откуда рисовать не имеет значения.



--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
lioness
Дата 11.8.2006, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Так этот код стоит и стоит в моем первом вопросе
Код

using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace WindowsApp_BTS
{
    public class TestBinaryTree
    {
  /*      private Point _p1 = new Point(0, 0);
        private Point _p2 = new Point(0, 0); */

        public TestBinaryTree() 
        {
            BinaryTree<int> btree = new BinaryTree<int>();
            btree.Root = new BinaryTreeNode<int>(1);
  
            btree.Root.Left = new BinaryTreeNode<int>(2);
  
            btree.Root.Right = new BinaryTreeNode<int>(3);
            btree.Root.Left.Left = new BinaryTreeNode<int>(4);
            btree.Root.Right.Right = new BinaryTreeNode<int>(5);
//  и так далее....
         }


        /*public Point SomePnt_p1
        {
            get { return this._p1; }
            set { this._p1 = value; }
        }
        public Point SomePnt_p2
        {
            get { return this._p2; }
            set { this._p2 = value; }
        }*/
     }
}


Это я точки для линий попыталась передать для Form1_Paint, но не знаю, надо ли мне так отслеживать каждое построение узла дерева с мгновенной прорисовкой. Сейчас попробую через наоборот передать свежепостроенное дерево btree из TestBinaryTree обратно в Form1. Там по дереву бегать взад-вперед.  Form1_Paint, наверное, надо заставить просто перерисовывать дерево от начала до конца???? Могу ли public переменную объявить в Form1, принести ее свежепостроенную "деревянную" из TestBinaryTree и чтобы Paint-у ее дать пережевать?

Graphics переменную я уже попробовала передать. Да, начинает выскакивать подсказка на графику, но он НЕ рисует. Я уже убрала ее из конструктора.

Это сообщение отредактировал(а) lioness - 11.8.2006, 12:00
PM MAIL   Вверх
lioness
Дата 11.8.2006, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



to Naum 

Неее, Graphics g = Graphics.FromHwnd дает подсказку 
Цитата

Graphics.Graphics.FromHwnd(IntPrt hwnd)
hwnd: Handle to a window


После "this" требует совершенно чего-то другого (Equals, ToString ....), а после Graphics g = Graphics.FromHwnd( предлагает что-то вроде HandledEventArgs или HandledEventHandler и еще много чего. И через компилятор ничего не проходит  smile 

Очевидная у меня была затея - быстренько реагировать графикой на содержание узлов. Но что-то ...  как-то ...  smile 
PM MAIL   Вверх
Naum
Дата 11.8.2006, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

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



lioness, странно у меня работает. Вообще, я в С# новичек. У мнея например у самого

Код

 Graphics g=Graphics.FromHwnd(this.Handle);


не работает, а работает

Код

 System.Drawing.Graphics g=System.Drawing.Graphics.FromHwnd(this.Handle);

 smile  smile  smile 

И я не знаю, что с этим делать.


--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
lioness
Дата 11.8.2006, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Нет, ну ладно уж если не хочет рисовать из TestBinaryTree. Действительно, идеологически некорректно. Но почему я не могу адрес дерева передать????  Вот Form1
Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApp_BTS
{
    public partial class Form1 : Form
    {
        private TestBinaryTree _adr;
 
         public Form1()
        {
            InitializeComponent();
            TestBinaryTree tbt = new TestBinaryTree();
            this._adr = tbt;
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            Color color = Color.Red;
            PointF CurrPoint = new PointF(0,0);
            CurrPoint.X = _adr.SomePnt_p1.X;
            CurrPoint.Y = _adr.SomePnt_p1.Y;

            g.DrawString("AAAA", new Font("Arial", 15), new SolidBrush(color), CurrPoint);
            CurrPoint.X = _adr.SomePnt_p2.X;
            CurrPoint.Y = _adr.SomePnt_p2.Y;
            g.DrawString("BBBB", new Font("Arial", 15), new SolidBrush(color), CurrPoint);
            g.DrawLine(new Pen(Color.Black, 3), _adr.SomePnt_p1, _adr.SomePnt_p2);
        }
    }
}

Вот TestBinaryTree
Код

using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace WindowsApp_BTS
{
    public class TestBinaryTree
    {
        private Point _p1 = new Point(100, 159);
        private Point _p2 = new Point(200, 200); 
        private BinaryTree<int> _adr;
 
        public TestBinaryTree() 
        {
            BinaryTree<int> btree = new BinaryTree<int>();
            this._adr = btree;

            btree.Root = new BinaryTreeNode<int>(1);
            btree.Root.Left = new BinaryTreeNode<int>(2);
            btree.Root.Right = new BinaryTreeNode<int>(3);
            btree.Root.Left.Left = new BinaryTreeNode<int>(4);
            btree.Root.Right.Right = new BinaryTreeNode<int>(5);
            btree.Root.Left.Left.Right = new BinaryTreeNode<int>(6);
            btree.Root.Right.Right.Right = new BinaryTreeNode<int>(7);
            Testbtree.Root.Right.Right.Right.Right = new BinaryTreeNode<int>(8);
        }
  /****************************************************************       
       public BinaryTree<int> GiveAdr
            {
                get { return _adr; }
                set {     }
            }
  /******************************************************************/
 
        public Point SomePnt_p1
        {
            get { return this._p1; }
            set { this._p1 = value; }
        }
        public Point SomePnt_p2
        {
            get { return this._p2; }
            set { this._p2 = value; }
        }
     }
}



Почему точки, которые я передаю, передаются и рисуются в Paint, а вот эта передача адреса дерева 
Цитата

       public BinaryTree<int> GiveAdr
            {
                get { return _adr; }
                set {     }
            }

не может даже пройти компиляцию. 
Т.е. мне бы получить доступ по адресу что-то типа: _adr.GiveAdr.Root.Left и т.д.
PM MAIL   Вверх
Naum
Дата 11.8.2006, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

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



Объявление переменной и конструктор Form1:

Код

 private TestBinaryTree _adr;
 public Form1()
 {
   InitializeComponent();
   this._adr=new TestBinaryTree();
  }


Paint метод класса Form1

Код

void Form1_Paint(object sender,PaintEventArgs pevent)
 {
  _adr.Paint(CreateGraphics());
 }


Класс TestBinaryTree

Код

    public class TestTreeNode
    {
        private Point _p1 = new Point(100, 159);
        private Point _p2 = new Point(200, 200);
        public TestTreeNode() 
        {
            //Всякая фигня    
        }
        public void Paint(Graphics g)
        {
            g.DrawLine(new Pen (Color.Red),_p1,_p2);
        }
    }



--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
lioness
Дата 11.8.2006, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Так вот только один отрезок и имеем  smile  
А когда идут отрезки одни за другим...  Как Paint для каждого отрезка после каждого узла "встряхнуть", ШОБ рисовал?  

После каждого узла (я в будущем хотела цветовые знаки на считывании информации сразу ставить: или мне нравится, что мне подсунули,  или -> "сюда не ходи! Снег на башка упадет! Совсем мертвый будешь (с)"

Но не получается это мимоходом при создании дерева. Да и все равно мне потом все это дерево -дцать раз анализировать. Все одно - убЕгаться. 
Просто теперь буду знать, как графику "перетащить" из основного Click-Paint-а  .  Мерси !


PM MAIL   Вверх
Naum
Дата 11.8.2006, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

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



Код

 void Form1_Paint(object sender,PaintEventArgs pevent)
 {
  _adr.Paint(CreateGraphics());
 }


Ошибочка тута,  smile 

_adr.Paint(pevent.Graphics);

Так быстрее будет.

Это сообщение отредактировал(а) Naum - 11.8.2006, 17:27


--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
lioness
Дата 11.8.2006, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А вот для ТОГО, ЧТОБЫ у меня "вытаскивался" адрес дерева в процедуре "GiveAdr" мне нужно было ЗАЧЕРКНУТЬ public в заголовке класса TestBinaryTree  smile Вот так:   public class TestBinaryTree
Код


class TestBinaryTree
    {
       private BinaryTree<int> _adr;

       public TestBinaryTree() 
          {

            BinaryTree<int> btree = new BinaryTree<int>();
            this._adr = btree;

// дерево создаём
        
      public BinaryTree<int> GiveAdr
        {
            get { return _adr; }
        }


А в Form1  - из моих предыдуших примеров - действительно я начинаю видеть информацию в узлах вот так _adr.GiveAdr.Root.Right.Value.ToString()

Только дерево надо создавать рекурсией, конечно  smile  Пойду домой - Java- примеры посмотрю. Чегой-то мы там пару лет назад рекурсировали  smile,  а то примеры Сишарпа с деревьями какие-то обрывочные. Если у кого ссылки есть, то киньте в меня, но только Сишарпом  smile 
PM MAIL   Вверх
Naum
Дата 11.8.2006, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

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



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

Код

        BinaryTreeNode SearchInBinaryTree(BinaryTreeNode btn,int val)
        {
            if (val<btn.Value.ToString())
            {
                if (btn.Left!=null)
                {
                    return SearchInBinaryTree(btn.Left);
                }
                else
                {
                    btn.Left=new BinaryTreeNode<int>(val);
                    return btn.Left;
                }
            }
            if (val>btn.Value.ToString())
            {
                if (btn.Right!=null)
                {
                    return SearchInBinaryTree(btn.Right);
                }
                else
                {
                    btn.Right=new BinaryTreeNode<int>(val);
                    return btn.Right;
                }
            }
            if (val==btn.Value.ToString())
            {
                return btn;
            }
        }


Добавлено @ 18:10 
Только эта функция не будет работать.  smile  Повторяю в С я новичек. 
Надо вместо btn.Value.ToString() как-то получить int значение. Но думаю смысл рекурсии понятен.

Это сообщение отредактировал(а) Naum - 11.8.2006, 17:57


--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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