Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
1 / 1 / 0
Регистрация: 13.02.2012
Сообщений: 120
.NET 4.x

Бинарное дерево с указателями

13.04.2016, 05:57. Показов 2793. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, решил поработать в C# с деревьями... За основу для того, чтобы понять, насколько корректно выполняется моя программа была взята работающая программа, написанная на delphi. Вот код:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
unit Unit5;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Grids, DB, DBGrids;
 
type
  TREE=^pTREE;
  pTREE=record
          element:string;
          lab:integer;
          leftchild,rightchild:TREE;
        end;
  
  massiv=array[1..127] of record
                             bin_uz:integer;
                             vopros:string;
                          end;
 
 
  TForm5 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    RadioGroup1: TRadioGroup;
    Button5: TButton;
    Button6: TButton;
    Edit5: TEdit;
    Button7: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form5: TForm5;
  A,ROOT:TREE;
  b:massiv;
  i:integer;
 
implementation
 
uses Unit4, Unit7, Unit1, Unit9, Unit10, Unit6, Unit26;
 
{$R *.dfm}
 
 
{Процедуры формирования дерева вопросов и ответов}
 
procedure INSERT(x1:string;x2:integer; var A:TREE);
begin
  if A=nil then begin
                  new(A);
                  A^.element:=x1;
                  A^.lab:=x2;
                  A^.leftchild:=nil;
                  A^.rightchild:=nil;
                end
            else if x2<A^.lab then INSERT(x1,x2,A^.leftchild)
            else if x2>A^.lab then INSERT(x1,x2,A^.rightchild);
end; {INSERT}
 
function MAKE_ROOT(x1:string;x2:integer):TREE;
begin
  new(ROOT);
  ROOT^.element:=x1;
  ROOT^.lab:=x2;
  ROOT^.leftchild:=nil;
  ROOT^.rightchild:=nil;
  MAKE_ROOT:=ROOT;
end;{MAKE_ROOT}
 
 
 
procedure TForm5.Button1Click(Sender: TObject);
begin
  if Form4.RadioGroup1.ItemIndex=1 then begin
                                          Form5.Visible:=false;
                                          Form7.Visible:=true;
                                        end;
  if Form1.RadioGroup1.ItemIndex=0 then begin
                                          Form5.Visible:=false;
                                          Form9.Visible:=true;
                                        end;
  if Form1.RadioGroup1.ItemIndex=1 then begin
                                          Form5.Visible:=false;
                                          Form10.Visible:=true;
                                        end;
end;
 
procedure TForm5.Button2Click(Sender: TObject);
begin
  if Form4.RadioGroup1.ItemIndex=1 then begin
                                          Form5.Visible:=false;
                                          Form6.Visible:=true;
                                        end;
  if Form4.RadioGroup1.ItemIndex=2 then begin
                                          Form5.Visible:=false;
                                          Form4.Visible:=true;
                                        end;
  if Form26.RadioGroup1.ItemIndex=0 then begin
                                          Form5.Visible:=false;
                                          Form26.Visible:=true;
                                        end;
  Form5.RadioGroup1.ItemIndex:=-1;
  Form5.RadioGroup1.Visible:=true;
end;
 
procedure TForm5.Button5Click(Sender: TObject);
begin
  if (RadioGroup1.ItemIndex=0) AND (A^.leftchild<>nil) AND (A^.rightchild<>nil) then begin
                                    A:=A^.leftchild;
                                    Edit5.Text:=A^.element;
                                    Memo1.Lines.Add(A^.element);
                                  end;
  if (RadioGroup1.ItemIndex=1) AND (A^.leftchild<>nil) AND (A^.rightchild<>nil) then begin
                                    A:=A^.rightchild;
                                    Edit5.Text:=A^.element;
                                    Memo1.Lines.Add(A^.element);
                                  end;
  if (A^.leftchild=nil) AND (A^.rightchild=nil) then
              begin
               { edit5.Text:=A^.element;
                Memo1.Lines.Add(A^.element);}
                RadioGroup1.Visible:=false;
                button5.Visible:=false;
              end;
 
end;
 
procedure TForm5.Button6Click(Sender: TObject);
begin
  {Задание бинарного дерева}
  b[1].bin_uz:=400;
  b[1].vopros:='В задаче одна целевая функция?';
  b[2].bin_uz:=200;
  b[2].vopros:='Методы решения много критериальных задач.';
  b[3].bin_uz:=2040;
  b[3].vopros:='Область в которой происходит задача оптимизации - это функциональные пространства?';
  b[4].bin_uz:=680;
  b[4].vopros:='Функция минимизации нескольких переменных?';
  b[5].bin_uz:=2560;
  b[5].vopros:='Исходная задача неустойчивая и её решение не является нерерывно зависящем от входных данных?';
...
  b[126].bin_uz:=1340;
  b[126].vopros:='Градиентный метод.';
  b[127].bin_uz:=1380;
  b[127].vopros:='Метод проекции градиента.';
  ROOT:=MAKE_ROOT(b[1].vopros,b[1].bin_uz);
  A:=ROOT;
  for i:=2 to 127 do
    INSERT(b[i].vopros,b[i].bin_uz,A);
  A:=ROOT;
  Edit5.Text:=A^.element;
  Memo1.Lines.Add(A^.element);
  Button6.Visible:=false;
end;
 
procedure TForm5.Button7Click(Sender: TObject);
begin
 A:=ROOT;
 Edit5.Text:=A^.element;
 Memo1.Lines.Add(A^.element);
 RadioGroup1.Visible:=true;
 button5.Visible:=true;
end;
 
end.
На C# за основу брал пример отсюда https://sohabr.net/habr/post/244377/
Получилось как-то так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
namespace _24hour
{
    public partial class Form1 : Form
    {
        //private Tree Tree;
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
 
        }
        public string prints = "";
        
        private void button2_Click(object sender, EventArgs e) //Кнопка "Далее"
        {
            string number = "";
            int i = 0;
            int j = 0;
            // Да - right
            //Нет - left
            if (radioButton1.Checked == true) //Да
            {
                i = 1;
            }
 
            if (radioButton2.Checked == true) //Нет
            {
                j = 1;
            }
 
            var queue = new Queue<TreeNode>(); // создать новую очередь
                                               //if (detailed)
            prints += "    заносим в очередь значение " + Node.Value.ToString() + Environment.NewLine;
            queue.Enqueue(Node); // поместить в очередь первый уровень
 
            if (queue.Count != 0)
            {
                if ((i == 0) && (j == 0))
                {
                    MessageBox.Show("Необходимо выбрать один из вариантов |Да| или |Нет|");
                }
                if ((i == 1) && (j == 0)) //Нажал "Да"
                {
                    //если у текущей ветви есть листья, их тоже добавить в очередь
                    if (queue.Peek().Left != null)
                    {
                        prints += "    заносим в очередь значение " + queue.Peek().Left.Value.ToString() + " из левого поддерева" + Environment.NewLine;
                        queue.Enqueue(queue.Peek().Left);
                    }
                    if (queue.Peek().Right != null)
                    {
                        number = queue.Peek().Right.Value.ToString(); //Число в текстовом документе по индексу которого получим строку
                        prints += "    заносим в очередь значение " + queue.Peek().Right.Value.ToString() + " из правого поддерева" + Environment.NewLine;
                        queue.Enqueue(queue.Peek().Right);
                    }
                    //извлечь из  очереди информационное поле последнего элемента
                    prints += "    извлекаем значение из очереди: " + queue.Peek().Value.ToString() + Environment.NewLine;
                    prints += queue.Peek().Value.ToString() + " ";
                    // убрать в очереди последний элемент
                    queue.Dequeue();
                    getString(number); //Передача числового значения уза для вывода его текстового значения
                }
                if ((i == 0) && (j == 1)) //Нажал "Нет"
                {
                    //если у текущей ветви есть листья, их тоже добавить в очередь
                    if (queue.Peek().Left != null)
                    {
                        number = queue.Peek().Left.Value.ToString(); //Число в текстовом документе по индексу которого получим строку
                        prints += "    заносим в очередь значение " + queue.Peek().Left.Value.ToString() + " из левого поддерева" + Environment.NewLine;
                        queue.Enqueue(queue.Peek().Left);
                    }
                    if (queue.Peek().Right != null)
                    {
                        prints += "    заносим в очередь значение " + queue.Peek().Right.Value.ToString() + " из правого поддерева" + Environment.NewLine;
                        queue.Enqueue(queue.Peek().Right);
                    }
                    //извлечь из  очереди информационное поле последнего элемента
                    prints += "    извлекаем значение из очереди: " + queue.Peek().Value.ToString() + Environment.NewLine;
                    prints += queue.Peek().Value.ToString() + " ";
                    // убрать в очереди последний элемент
                    queue.Dequeue();
                    getString(number); //Передача числового значения уза для вывода его текстового значения
                }
            }
        }
        public void getString(string number)
        {
            int index=0;
            using (StreamReader sReader = new StreamReader(@"number.txt")) //Получили веса вершин бинарного дерева
            {
                string[] helpArray = sReader.ReadToEnd().Split('\n');
                for (int i = 0; i < helpArray.Length; i++)
                {
                    if (helpArray[i] == number)
                    {
                        index = i; //Получили индекс, по которому получми строку из массива TexthelpArray
                        break;
                    }
                }
            }
            using (StreamReader sReader = new StreamReader(@"question.txt")) //Получили текст для каждого узла бинарного дерева
            {
                string[] TexthelpArray = sReader.ReadToEnd().Split('\n');
                richTextBox2.Text += TexthelpArray[index]+'\n';
            }
        }
        //public string prints = "";
        private void button3_Click(object sender, EventArgs e) //Загрузить дерево
        {
            //Читаем дерево из файла
            using (var file = new System.IO.StreamReader(@"number.txt"))
            {
                while (file.Peek() >= 0)
                {
                    string lineCurrent = file.ReadLine();
                    if (lineCurrent != null) Add(int.Parse(lineCurrent));
                }
            }
            string s = "";
            Print(ref s);
            richTextBox1.Text = s;
            prints = s;
            //Across(Node, ref s);
 
        }
        public void for_textBox()
        {
            textBox1.Text = prints;
        }
        public class TreeNode
        {
            public int Value; // численное значение
            public int Count = 0; // количество значений (сколько раз было добавлено данное численное значение) 
            public TreeNode Left; // левое поддерево
            public TreeNode Right; // правое поддерево
        }
        public TreeNode Node; // экземпляр класса "элемент дерева"
        
        // добавление значения в дерево (публичный метод)
        public void Add(int value)
        {
            // аргумент int value - значение, которое добавляется 
            AddRecursion(ref Node, value); // вызов внутреннего метода для добавления (нужно для того, чтобы лишний раз не вызывать "ref Node" вне класса, где это вообще не по смыслу) 
        }
        private void AddRecursion(ref TreeNode node, int val)
        {
            /*
             Аргументы метода:
             1. ref TreeNode Node - текущий "элемент дерева" (ref - передача по ссылке)
             2. int val - передаваемое (добавляемое значение)
            */
            if (node == null) // если было вызвано добавление, а этого элемента не создано 
            {
                node = new TreeNode(); // создать новый элемент дерева
                node.Value = val; // присвоить созданному элементу добавляемого значение
                node.Count = 1; // элемент добавлен только 1 раз
            }
            else // если данный элемент создан
            {
                if (node.Value == val) // если добавляемое значение совпадает тем, которое есть - увеличить счетчик повторений 
                    node.Count++;
                else
                {
                    if ((node.Value) > val) // если добавляемое значение больше того, которое есть 
                    {
                        AddRecursion(ref node.Left, val); // добавить в левое поддерево
                    }
                    else // если добавляемое значение меньше того, которое есть
                    {
                        AddRecursion(ref node.Right, val); // добавить в правое поддерево
                    }
                }
            }
        }
 
        // печать дерева (публичный метод)
        public void Print(ref string s)
        {
            // аргумент ref string s - строка, в которой накапливается представление дерева в текстовом виде (ref - передача по ссылке)
            s = ""; // обнуляем строку
            PrintRecursion(Node, 0, ref s); // вызов внутреннего метода для печати (нужно для того, чтобы лишний раз не вызывать "Node" вне класса) 
        }
 
        // печать дерева (рекурсивно) 
        private void PrintRecursion(TreeNode root, int spaces, ref string s)
        {
            //
        }
    }
}
Уже мозг сломал, подскажите, пожалуйста, что я делаю не так? Может есть более простой способ реализации?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.04.2016, 05:57
Ответы с готовыми решениями:

Бинарное дерево
Здравствуйте уважаемые программисты. У меня поставлена задача: &quot;Исходными данными задачи является: Бинарное дерево. Ключ - ФИО; Способ...

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

Исходное бинарное дерево превратить в бинарное дерево поиска, при этом сохранив его структуру
Помогите, не могу понять!( Нужно исходное бинарное дерево превратить в бинарное дерево поиска, при этом сохранив его структуру. вот...

8
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
13.04.2016, 09:37
Цитата Сообщение от Serega@93-93 Посмотреть сообщение
Уже мозг сломал, подскажите, пожалуйста, что я делаю не так? Может есть более простой способ реализации?
1) Сформулируйте подробно задачу, которую вы решаете.
2) Код, который вы взяли с хабра не имеет почти никакого отношения к коду приведенному на делфи. Большинство методов - вам не нужно.
3) Почему вы используете бинарное дерево? Зачем оно для дерева вопросов? Да еще с костылями в виде числовых значений bin_uz? Бинарные деревья используются для быстрого поиска. У вас же дерево для отображения иерархии вопросов. Нужно использовать обычное дерево, и убрать это извращение с числами.
0
1 / 1 / 0
Регистрация: 13.02.2012
Сообщений: 120
13.04.2016, 10:29  [ТС]
Спасибо, что откликнулись, итак:
1. Задача состоит в том, чтобы посредством вопросов, представленных в виде определенной иерархии (дерева) получить ответ (в данном примере на delphi определяется оптимальный метод решения поставленной задачи посредством, насколько я понимаю, обхода дерева в ширину).
2. Да, возможно вы правы насчет лишних методов, их я использовал для того, чтобы постараться поглубже разобраться с деревьями...
3. Как я уже сказал, в коде содержатся не только вопросы, но и ответы... Насчет bin_uz, как я понял, это для того, чтобы представить строки в виде иерархии. Как-то так..

А что вы понимаете под обычным деревом? Как его объявить? И главное, как заполнять, чтобы сохранилась нужная мне иерархия? А в программе нужно сделать так, чтобы при выборе radiobutton1 (Да) и нажатии на кнопку OK был взят правый лист ветки и выведено его текстовое значение в textBox1+=.., а при выборе radiobutton2 (Нет) и нажатии на кнопку OK соответственно, левый лист и его текстовое значение в textBox1+=...
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
13.04.2016, 11:54
Лучший ответ Сообщение было отмечено Serega@93-93 как решение

Решение

Цитата Сообщение от Serega@93-93 Посмотреть сообщение
А что вы понимаете под обычным деревом? Как его объявить? И главное, как заполнять, чтобы сохранилась нужная мне иерархия? А в программе нужно сделать так, чтобы при выборе radiobutton1 (Да) и нажатии на кнопку OK был взят правый лист ветки и выведено его текстовое значение в textBox1+=.., а при выборе radiobutton2 (Нет) и нажатии на кнопку OK соответственно, левый лист и его текстовое значение в textBox1+=...
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
 
namespace WindowsFormsApplication339
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
 
            //вопросы в плоском тексте
            var text = @"
=В задаче одна целевая функция?
 Да=Область в которой происходит задача оптимизации - это функциональные пространства?
  Да=Исходная задача неустойчивая и её решение не является нерерывно зависящем от входных данных?
   Да=Градиентный метод.
   Нет=Метод проекции градиента.
  Нет=Функция минимизации нескольких переменных?
   Да=Метод проекции градиента.
   Нет=Градиентный метод.
  Не знаю=Используйте градиентный метод.
 Нет=Методы решения много критериальных задач? 
  Да=Градиентный метод.
  Нет=Метод проекции градиента.
";
            //парсим вопросы
            var root = Node.Parse(text);
            //создаем панель
            var pn = new NodePanel {Parent = this, Dock = DockStyle.Fill};
            pn.NodeSelected += (o, e) => { pn.Build(e.Node); };
            //начинаем опрос
            pn.Build(root[0]);
        }
    }
 
    /// <summary>
    /// Панель для отображения вопросов
    /// </summary>
    class NodePanel : UserControl
    {
        public EventHandler<NodeSelectedEventArgs> NodeSelected = delegate { };
 
        public void Build(Node node)
        {
            var y1 = 200;
            var btWidth = 100;
 
            Controls.Clear();
 
            //лейба
            var lb = new Label {AutoSize = false, Dock = DockStyle.Top, Height = y1 - 10, Parent = this, Text = node.Text, Font = new Font(FontFamily.GenericSansSerif, 24)};
 
            //кнопки
            var x = 0;
            foreach(var child in node)
            {
                var theChild = child;
                var bt = new Button {Parent = this, Text = child.Condition, Left = x, Top = y1, Width = btWidth};
                bt.Click += delegate { NodeSelected(this, new NodeSelectedEventArgs { Node = theChild }); };
                x += btWidth;
            }
        }
    }
 
    class NodeSelectedEventArgs : EventArgs
    {
        public Node Node { get; set; }
    }
 
    /// <summary>
    /// Вершина дерева
    /// </summary>
    class Node : List<Node> //вершина содержит список своих детей
    {
        /// <summary>
        /// Текст вопроса или заключения
        /// </summary>
        public string Text { get; set; }
 
        /// <summary>
        /// Условие срабатывания
        /// </summary>
        public string Condition { get; set; }
 
        /// <summary>
        /// Парсинг плоского текста в дерево (формат Tree [url]https://habrahabr.ru/post/248147/[/url])
        /// </summary>
        public static Node Parse(string text)
        {
            var root = new Node();
            var lines = text.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
            Parse(root, lines, 0, 0);
 
            return root;
        }
 
        static void Parse(Node parent, string[] lines, int currentLine, int level)
        {
            if (currentLine >= lines.Length) return;
 
            for (int i = currentLine; i < lines.Length; i++)
            {
                var line = lines[i];
                var trimmed = line.TrimStart();
                var spaces = line.Length - trimmed.Length;
                if (spaces < level) return;
                if (spaces == level)
                {
                    var n = ParseNode(trimmed);
                    parent.Add(n);
                    Parse(n, lines, i + 1, level + 1);
                }
            }
        }
 
        static Node ParseNode(string line)
        {
            var parts = line.Split(new char[]{'='}, 2);
            return new Node() { Text = parts[1].Trim(), Condition = parts[0].Trim() };
        }
    }
}
1
1 / 1 / 0
Регистрация: 13.02.2012
Сообщений: 120
13.04.2016, 13:38  [ТС]
Спасибо огромное за такой развернутый ответ! Вы мне очень помогли. Сейчас студии нет под рукой, вечером подробнее рассмотрю))
0
1 / 1 / 0
Регистрация: 13.02.2012
Сообщений: 120
15.04.2016, 04:28  [ТС]
Я внимательно все рассмотрел, то, что вы написали мне подходит, правда пришлось все дерево из 127 возможных исходов прописывать в программе, на которую я полагаюсь, чтобы проставить да или нет ) это в visio делал... Остался вопрос. А как отвязаться от динамически создаваемых элементов интерфейса в коде? Мне нужна вот такая форма
Я попробовал убрать class NodePanel, но у меня не получилось... Мне нужно чтобы текущий вопрос транслировался в textBox, а в richTextBox накапливались ответы пользователя с его ответами. Переход между вопросами посредством нажатия кнопки "Подтвердить". При нажатии начать сначала хотел предусмотреть возможность повторного прохождения .. ну а кнопка "Загрузить дерево" инициализирует начало опроса, но можно в принципе и без нее.
0
1 / 1 / 0
Регистрация: 13.02.2012
Сообщений: 120
19.04.2016, 21:01  [ТС]
Вопрос открыт, я никак не могу понять, как уйти от class NodePanel : UserControl и привязаться к обычным кнопкам "Да" и "Нет"
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
20.04.2016, 11:04
Лучший ответ Сообщение было отмечено Serega@93-93 как решение

Решение

Цитата Сообщение от Serega@93-93 Посмотреть сообщение
Вопрос открыт, я никак не могу понять, как уйти от class NodePanel : UserControl и привязаться к обычным кнопкам "Да" и "Нет"
Вот не хотите делать по человечески

Вот вам с обычными кнопками: WindowsFormsApplication339.zip
1
1 / 1 / 0
Регистрация: 13.02.2012
Сообщений: 120
20.04.2016, 13:30  [ТС]
Еще раз спасибо Вам большое =)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.04.2016, 13:30
Помогаю со студенческими работами здесь

Преобразовать идеальное бинарное дерево в бинарное дерево поиска
Всем привет, я создал идельное бинарное дерево и написал к нему функции. Как мне теперь можно преобразовать его в бинарное дерево поиска?...

Бинарное дерево: как происходит добавления элемента в дерево с двумя параметрами
Здравствуйте! Прошу помощи у опытных программистов...)))) Есть класс дерево: class class1 { public class Tree ...

Бинарное дерево. Удалить из дерева часть вершин так, чтобы оставшееся дерево стало пирамидой
Дано бинарное дерево. Удалить из дерева часть вершин так, чтобы оставшееся дерево стало пирамидой.

Бинарное дерево
Люди помогите пожалуйста написать функцию, которая будет считывать корень бинарного дерева и выдавать количество листьев у этого дерева. ...

Бинарное дерево
Мой код: Patient.h // // Created by User on 26.04.2016. // #ifndef LABA_10_PATIENT_H #define LABA_10_PATIENT_H using...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru