Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/54: Рейтинг темы: голосов - 54, средняя оценка - 4.54
 Аватар для iama
1360 / 988 / 119
Регистрация: 30.07.2010
Сообщений: 5,297

Сравнение двух деревьев

28.08.2011, 16:23. Показов 10438. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Даны два дерева - не важно, как, можно хоть списком ребер, хоть списками смежности, хоть матрицей смежности. Нужно определить, являются ли эти два дерева, один и тем же деревом, только с разными порядками обхода вершин (вершины не взвешены).

Под катом
списки смежности двух одинаковых деревьев:
1 5 6
0 2 3
1
1 4
3
0
0 7 8
6
6

1 2 6
0
0 3 5
2 4
3
2
0 7 8
6
6
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.08.2011, 16:23
Ответы с готовыми решениями:

Сравнение двух бинарных деревьев
Помогите, пожалуйста, разобраться в следующей программе. program Laba2; {Программа сравнения двух бинарных деревьев. ВНИМАНИЕ:...

Сравнение бинарных деревьев
Здравствуйте, уважаемое сообщество. Необходима ваша помощь! Положим у нас есть 2 бинарных дерева. Нужно сравнить их: 1)вернуть...

Деревья. Сравнение деревьев.
Рекурсивно и не рекурсивно создать и продемонстрировать работу логической функции equal (T1,T2), проверяющую на равенство деревья Т1 и Т2. ...

9
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
29.08.2011, 10:23
Перебором
0
 Аватар для iama
1360 / 988 / 119
Регистрация: 30.07.2010
Сообщений: 5,297
29.08.2011, 10:42  [ТС]
odip, можно подробней? Под катом - одни и те же деревья, но пронумерованы они по разному, поэтому сравнение спиков ребер не даст правильного ответа, их для этого нужно как-то перенумеровать, но топологическая сортировка тут явно не поможет.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
29.08.2011, 11:15
iama, известно, какие варианты обходов используются? Если да, то можно построить одно из деревьев и обходить его всеми возможными способами. Если один из вариантов совпадёт со вторым деревом - деревья одинаковые. Иначе - нет.
0
 Аватар для iama
1360 / 988 / 119
Регистрация: 30.07.2010
Сообщений: 5,297
29.08.2011, 11:42  [ТС]
silent_1991, обходы могут быть какие угодно. Судя по всему, это главная проблема задачи, отсортировать поддеревья в определенном порядке, чтобы можно было их сравнивать
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
30.08.2011, 13:26
Вот так можно:
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
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
/////////////////////////////////////////////////////////////////////////////////////////
// Программа определяет, эквивалентны ли два дерева, заданные списком ребер.
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <iostream>
#include <list>
#include <map>
#include <set>
#include <string>
#include <utility>
#include <vector>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string  T_str;
typedef T_str        T_vertex;    
/////////////////////////////////////////////////////////////////////////////////////////
class  T_tree
{  
    typedef std::map     <T_vertex,  int>                    T_vertices_weights;
    typedef std::set     <T_vertex>                          T_vertices;
    typedef T_vertices::const_iterator                       T_vert_const_it;
    typedef std::pair    <T_vert_const_it, T_vert_const_it>  T_edge;
    typedef std::list    <T_edge>                            T_edges;    
    typedef std::vector  <int>                               T_tree_key;    
    //-----------------------------------------------------------------------------------
    T_edges                     edges_;
    T_vertices                  vertices_;
    mutable T_vertices_weights  vertices_weights_;
    //-----------------------------------------------------------------------------------
public:
    //-----------------------------------------------------------------------------------
    bool  operator== (const T_tree&  tree) const
    {
        return  get_key() == tree.get_key();
    }
    //-----------------------------------------------------------------------------------
    bool  add_edge
        (
            const T_vertex&  vertex_1, 
            const T_vertex&  vertex_2
        )
    {
        //Ребро принимается, если множество ребер пусто, или если одна из вершин ребра 
        //принадлежит дереву, а другая нет.        
        bool  bool_res = false;
        if( vertices_.empty() )
        {
            bool_res = vertex_1 != vertex_2;
        }
        else
        {
            bool_res =   vertices_.count(vertex_1) 
                       + vertices_.count(vertex_2) == 1;
        }
                         
        if(bool_res)
        {
            vertices_.insert(vertex_1);
            vertices_weights_[vertex_1] = 1;
 
            vertices_.insert(vertex_2);
            vertices_weights_[vertex_2] = 1;
 
            edges_.push_back
                (
                    std::make_pair
                        (
                            vertices_.find(vertex_1),
                            vertices_.find(vertex_2)
                        )
                );
        }        
        return  bool_res;
    }
    //-----------------------------------------------------------------------------------
    int  edges_count() const
    {
        return  edges_.size();
    }
    //-----------------------------------------------------------------------------------
    const T_vertices&  get_vertices() const
    {
        return  vertices_;
    }
    //-----------------------------------------------------------------------------------
private:
    //-----------------------------------------------------------------------------------    
    static T_vertices  get_vertices_with_degree_greater_1(const T_edges&  edges)
    {
        typedef std::map<T_vertex, int>  T_vert_degree;
 
        T_vert_degree                    vert_degree;
        T_vertices                       res_vertices;
 
        for(T_edges::const_iterator  edge_it = edges.begin(); edge_it != edges.end(); ++edge_it)
        {
            const T_vertex  v1 = *edge_it->first;
            const T_vertex  v2 = *edge_it->second;            
            
            if(++vert_degree[v1] > 1)
            {
                res_vertices.insert(v1);
            }
 
            if(++vert_degree[v2] > 1)
            {
                res_vertices.insert(v2);
            }
        }
        return  res_vertices;        
    }
    //-----------------------------------------------------------------------------------    
    T_tree_key  get_root_tree_key
        (
            const T_vertex&  root, 
            T_vertices       vertices           
        ) const 
    {
        T_tree_key  res_tree_key;        
        res_tree_key.push_back(vertices_weights_.find(root)->second);
        vertices.erase(root);
 
        T_vertices  root_children;
        //Пробегаемся по всем ребрам дерева и из каждого ребра, содержащего корень, 
        //заносим в root_children его сына, если он принадлежит vertices.
        for(T_edges::const_iterator  edge_it = edges_.begin(); edge_it != edges_.end(); 
            ++edge_it)
        {            
            T_vertex  v1 = *edge_it->first;
            T_vertex  v2 = *edge_it->second;
            
            if(   root                == v1
               && vertices.count(v2)  != 0 )
            {
                root_children.insert(v2);
            }
            else if(   root == v2
                    && vertices.count(v1) != 0 )
            {
                root_children.insert(v1);
            }
        }
        
        typedef std::set<T_tree_key>  T_tree_keys;
        T_tree_keys                   children_tree_keys;
        //Пробегаемся по root_children, находим tree_key для каждого поддерева с корнем 
        //в этой вершине и заносим их в children_tree_keys.        
        for(T_vertices::const_iterator  child_it = root_children.begin();
            child_it != root_children.end(); ++child_it)
        {
            children_tree_keys.insert
                (
                    get_root_tree_key
                        (
                            *child_it,
                            vertices
                        )
                );
        }        
 
        //Пробегаемся по children_tree_keys и добавляем все ключи в хвост ключу res_tree_key.
        for(T_tree_keys::const_iterator  child_key_it = children_tree_keys.begin();
            child_key_it != children_tree_keys.end(); ++child_key_it)
        {
            res_tree_key.insert
                (
                    res_tree_key.end(),
                    child_key_it->begin(),
                    child_key_it->end()
                );
        }
        return  res_tree_key;
    }
    //-----------------------------------------------------------------------------------
    T_tree_key  get_key() const
    {       
        T_edges     edges_for_get_key     = edges_;      
        T_vertices  vertices_for_get_key  = vertices_;
 
        while(vertices_for_get_key.size() > 2)
        {
            vertices_for_get_key 
                = get_vertices_with_degree_greater_1(edges_for_get_key);            
 
            //Пробегаемся по edges_for_get_key и если одна из вершин ребра не принадлежит
            //vertices_for_get_key, то для другой вершины этого ребра увеличиваем вес на 1 
            //и удаляем это ребро.            
            for(T_edges::const_iterator  edge_it = edges_for_get_key.begin();
                edge_it != edges_for_get_key.end(); )
            {                
                const T_vertex&  v1 = *edge_it->first;
                const T_vertex&  v2 = *edge_it->second;
                
                bool  v1_is_leaf_in_edges_for_get_key  = vertices_for_get_key.count(v1) == 0;
                bool  v2_is_leaf_in_edges_for_get_key  = vertices_for_get_key.count(v2) == 0;
 
                if(   v1_is_leaf_in_edges_for_get_key
                   || v2_is_leaf_in_edges_for_get_key )
                {                   
                    ++vertices_weights_.find(v1_is_leaf_in_edges_for_get_key ? v2 : v1)->second;
                    
                    T_edges::const_iterator  edge_it_for_erase = edge_it;
                    ++edge_it;
                    edges_for_get_key.erase(edge_it_for_erase);               
                }
                else
                {
                    ++edge_it;
                }
            }//for        
        }//while
        //Утверждение. Каждая вершина дерева имеет вес, равный числу вершин
        //в дереве, корнем которого она является, а vertices_for_get_key
        //содержит одну или две вершины, которые и назначаем корнями дерева.
 
        T_vertex  A_root = *vertices_for_get_key.begin   ();
        T_vertex  B_root = *vertices_for_get_key.rbegin  ();        
 
        T_tree_key  A_tree_key = 
            get_root_tree_key
                (
                    A_root,
                    vertices_
                );
 
        if(B_root != A_root)
        {
            T_tree_key  B_tree_key = 
                get_root_tree_key
                    (
                        B_root,
                        vertices_
                    );
            return  std::min(A_tree_key, B_tree_key);
        }
        return  A_tree_key;
    }
};
/////////////////////////////////////////////////////////////////////////////////////////
void  input_tree_edges
    (
        int      tree_edges_total,
        T_tree&  tree
    )
{    
    do
    {
        std::cout << '\t'
                  << "ребро #"
                  << tree.edges_count() + 1
                  << ":"
                  << std::endl;
 
        T_vertex  vertex_1;
        do
        {
            std::cout << '\t'
                      << '\t'
                      << "вершина 1";
 
            if( tree.edges_count() )
            {
                std::cout <<" (из списка: ";            
 
                std::copy
                    (
                        tree.get_vertices().begin(),
                        tree.get_vertices().end(),
                        std::ostream_iterator<T_vertex>(std::cout, " ")
                    );
                std::cout  <<")";
            }
            else
            {
                std::cout <<" (корень дерева)";
            }
                      
            std::cout <<": ";
 
            std::cin >> vertex_1;
        }while(   tree.edges_count() != 0
               && tree.get_vertices().find(vertex_1) == tree.get_vertices().end() );        
 
        T_vertex  vertex_2;
        do
        {
            std::cout << '\t'
                      << '\t' 
                      << "вершина 2: ";
 
            std::cin >> vertex_2;
        }while( !tree.add_edge(vertex_1, vertex_2) ); 
 
        std::cout << std::endl;
    }while(tree.edges_count() < tree_edges_total); 
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
 
    int  tree_A_edges_total = 0;
    do
    {
        std::cout << "Введите количество ребер первого дерева: ";
        std::cin >> tree_A_edges_total;
    }while(tree_A_edges_total <= 0);
    
    std::cout << "Введите "
              << tree_A_edges_total
              << " ребер первого дерева:"
              << std::endl;
    T_tree  tree_A;
    input_tree_edges(tree_A_edges_total, tree_A);
 
 
    int  tree_B_edges_total = 0;
    do
    {
        std::cout << std::endl
                  << std::endl
                  << "Введите количество ребер второго дерева: ";
        std::cin >> tree_B_edges_total;
    }while(tree_B_edges_total <= 0);
    
    std::cout << "Введите "
              << tree_B_edges_total
              << " ребер второго дерева:"
              << std::endl;
    T_tree  tree_B;
    input_tree_edges(tree_B_edges_total, tree_B);
 
    
    std::cout << "Деревья "
              << (tree_A == tree_B ? "" : "НЕ ")
              << "эквивалентны."
              << std::endl;
}
2
 Аватар для iama
1360 / 988 / 119
Регистрация: 30.07.2010
Сообщений: 5,297
30.08.2011, 13:31  [ТС]
Ничего так буду разбираться, спасибо огромное
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
30.08.2011, 18:15
Еще один способ:
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
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
/////////////////////////////////////////////////////////////////////////////////////////
// Программа определяет, эквивалентны ли два дерева, заданные списком ребер.
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <iostream>
#include <list>
#include <map>
#include <set>
#include <string>
#include <utility>
#include <vector>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string  T_str;
typedef T_str        T_vertex;    
/////////////////////////////////////////////////////////////////////////////////////////
class  T_tree
{  
    typedef std::map       <T_vertex,        int>              T_vertices_distances;
    typedef std::set       <T_vertex>                          T_vertices;
    typedef T_vertices::const_iterator                         T_vert_const_it;
    typedef std::pair      <T_vert_const_it, T_vert_const_it>  T_edge;
    typedef std::list      <T_edge>                            T_edges;    
    typedef std::multiset  <int>                               T_tree_key;    
    //-----------------------------------------------------------------------------------
    T_edges                       edges_;
    T_vertices                    vertices_;
    mutable T_vertices_distances  vertices_distances_;
    //-----------------------------------------------------------------------------------
public:
    //-----------------------------------------------------------------------------------
    bool  operator== (const T_tree&  tree) const
    {
        return  get_key() == tree.get_key();
    }
    //-----------------------------------------------------------------------------------
    bool  add_edge
        (
            const T_vertex&  vertex_1, 
            const T_vertex&  vertex_2
        )
    {
        //Ребро принимается, если множество ребер пусто, или если одна из вершин ребра 
        //принадлежит дереву, а другая нет.        
        bool  bool_res = false;
        if( vertices_.empty() )
        {
            bool_res = vertex_1 != vertex_2;
        }
        else
        {
            bool_res =   vertices_.count(vertex_1) 
                       + vertices_.count(vertex_2) == 1;
        }
                         
        if(bool_res)
        {
            vertices_.insert(vertex_1);           
            vertices_.insert(vertex_2);            
 
            edges_.push_back
                (
                    std::make_pair
                        (
                            vertices_.find(vertex_1),
                            vertices_.find(vertex_2)
                        )
                );
        }        
        return  bool_res;
    }
    //-----------------------------------------------------------------------------------
    int  edges_count() const
    {
        return  edges_.size();
    }
    //-----------------------------------------------------------------------------------
    const T_vertices&  get_vertices() const
    {
        return  vertices_;
    }
    //-----------------------------------------------------------------------------------
private:
    //-----------------------------------------------------------------------------------    
    T_vertices  get_leafs() const
    {
        typedef std::map<T_vertex, int>  T_vert_degree;
 
        T_vert_degree                    vert_degree;
        T_vertices                       res_vertices = vertices_;
 
        for(T_edges::const_iterator  edge_it = edges_.begin(); edge_it != edges_.end(); ++edge_it)
        {
            const T_vertex  v1 = *edge_it->first;
            const T_vertex  v2 = *edge_it->second;            
            
            if(++vert_degree[v1] > 1)
            {
                res_vertices.erase(v1);
            }
 
            if(++vert_degree[v2] > 1)
            {
                res_vertices.erase(v2);
            }
        }
        return  res_vertices;       
    }
    //-----------------------------------------------------------------------------------    
    T_tree_key  get_key() const
    {
        T_tree_key  res_tree_key;
        //Находим множество вершин-листьев дерева.
        T_vertices  leafs = get_leafs();
        
        //Пробегаемся по всем листьям, и для каждого находим расстояние до всех
        //остальных листьев.
        for(T_vertices::const_iterator  leaf_it = leafs.begin(); 
            leaf_it != leafs.end(); ++leaf_it)
        {
            //Обнуляем расстояния для вершины *leaf_it.
            vertices_distances_[*leaf_it] = 0;
            //Создаем множество для измерения расстояний из вершины *leaf_it.
            T_vertices  tree_from_cur_leaf;
            tree_from_cur_leaf.insert(*leaf_it);
            while( tree_from_cur_leaf.size() < vertices_.size() )
            {
                //Перебираем ребра дерева, и если находим ребро, одна вершина 
                //которого принадлежит tree_from_cur_leaf, а другая нет, то 
                //включаем ее в tree_from_cur_leaf и присваиваем ей расстояние
                //на единицу большее, чем у другой вершины этого ребра.
                for(T_edges::const_iterator  edge_it = edges_.begin();
                    edge_it != edges_.end(); ++edge_it)
                {
                    T_vertex  v1 = *edge_it->first;
                    T_vertex  v2 = *edge_it->second;
 
                    if(  tree_from_cur_leaf.count(v1)
                       + tree_from_cur_leaf.count(v2) != 1 )
                    {
                        continue;
                    }
 
                    T_vertex  new_vert = v1;
                    T_vertex  old_vert = v2;
 
                    if( tree_from_cur_leaf.count(v1) )
                    {
                        std::swap(new_vert, old_vert);
                    }                    
 
                    tree_from_cur_leaf.insert(new_vert);
                    vertices_distances_[new_vert] 
                        = vertices_distances_[old_vert] + 1;
                    //Если это лист, то записываем это расстояние в ключ.
                        if( leafs.count(new_vert) == 1 )
                    {
                        res_tree_key.insert(vertices_distances_[new_vert]);
                    }                       
                }//for
            }//while        
        }//for
        return  res_tree_key;
    }
};
/////////////////////////////////////////////////////////////////////////////////////////
void  input_tree_edges
    (
        int      tree_edges_total,
        T_tree&  tree
    )
{    
    do
    {
        std::cout << '\t'
                  << "ребро #"
                  << tree.edges_count() + 1
                  << ":"
                  << std::endl;
 
        T_vertex  vertex_1;
        do
        {
            std::cout << '\t'
                      << '\t'
                      << "вершина 1";
 
            if( tree.edges_count() )
            {
                std::cout <<" (из списка: ";            
 
                std::copy
                    (
                        tree.get_vertices().begin(),
                        tree.get_vertices().end(),
                        std::ostream_iterator<T_vertex>(std::cout, " ")
                    );
                std::cout  <<")";
            }
            else
            {
                std::cout <<" (корень дерева)";
            }
                      
            std::cout <<": ";
 
            std::cin >> vertex_1;
        }while(   tree.edges_count() != 0
               && tree.get_vertices().find(vertex_1) == tree.get_vertices().end() );        
 
        T_vertex  vertex_2;
        do
        {
            std::cout << '\t'
                      << '\t' 
                      << "вершина 2: ";
 
            std::cin >> vertex_2;
        }while( !tree.add_edge(vertex_1, vertex_2) ); 
 
        std::cout << std::endl;
    }while(tree.edges_count() < tree_edges_total); 
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
 
    int  tree_A_edges_total = 0;
    do
    {
        std::cout << "Введите количество ребер первого дерева: ";
        std::cin >> tree_A_edges_total;
    }while(tree_A_edges_total <= 0);
    
    std::cout << "Введите "
              << tree_A_edges_total
              << " ребер первого дерева:"
              << std::endl;
    T_tree  tree_A;
    input_tree_edges(tree_A_edges_total, tree_A);
 
 
    int  tree_B_edges_total = 0;
    do
    {
        std::cout << std::endl
                  << std::endl
                  << "Введите количество ребер второго дерева: ";
        std::cin >> tree_B_edges_total;
    }while(tree_B_edges_total <= 0);
    
    std::cout << "Введите "
              << tree_B_edges_total
              << " ребер второго дерева:"
              << std::endl;
    T_tree  tree_B;
    input_tree_edges(tree_B_edges_total, tree_B);
 
    
    std::cout << "Деревья "
              << (tree_A == tree_B ? "" : "НЕ ")
              << "эквивалентны."
              << std::endl;
}
1
 Аватар для iama
1360 / 988 / 119
Регистрация: 30.07.2010
Сообщений: 5,297
30.08.2011, 19:07  [ТС]
Mr.X, вы сами пишете или откуда такое добро берете?
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
30.08.2011, 19:56
Цитата Сообщение от iama Посмотреть сообщение
Mr.X, вы сами пишете или откуда такое добро берете?
Сам, разумеется. Критерии эквивалентности деревьев из интернета взял (один слегка доработал).
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.08.2011, 19:56
Помогаю со студенческими работами здесь

Сравнение бинарных деревьев на ЛИСП
Здравствуйте, уважаемое сообщество. Необходима ваша помощь! Положим у нас есть 2 бинарных дерева. Нужно сравнить их: 1)вернуть...

Equals двух деревьев
Гайс я написал метод equals но он не работает рекурсивно и выводит только false. Как можно исправить ошибку в коде public class...

Сравнить структуру двух деревьев
Написать два варианта функции(с рекурсией и без). Даны два дерева,два указателя на корни. Функция возвращает логическое значение:если...

Написать программу для проверки двух деревьев на изоморфность
Добавляю готовый код работающий в Prolog 5.2 &quot;Написать программу для проверки двух деревьев на изоморфность&quot;.include...

Массив: Учащиеся участвовали в посадке деревьев. Сколько деревьев было посажено
1)Учащиеся 8-х классов участвовали в посадке деревьев. 8-а посадил 100 деревьев, 8-б —122 дерева, 8-в — 98 деревьев, 8-г — 104 дерева, 8-д...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
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 - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru