Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 27, средняя оценка - 5.00
thick_int
Заблокирован
#1

Обход дерева - C++

03.05.2012, 18:15. Просмотров 4371. Ответов 2
Метки нет (Все метки)

Вот начал читать про деревья и способы их обхода (PreOrder, InOrder и PostOrder).
С алгоритмами проблем нет, но видно, как бы это сказать поточнее, не хватает что ли пространственного воображения, чтобы представить в чем суть каждого способа обхода.

Хотелось бы получить яркий пример, не обязательно, связанный с программированием, который демонстрирует разницу в методах обхода.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.05.2012, 18:15     Обход дерева
Посмотрите здесь:

Обход дерева - C++
Всем доброе время суток. Не могу нормально обойти дерево и просмотреть введённое, по всей видимости, возможно я неправильно поставил...

Обход дерева) - C++
Прога работает) но сказали, что нужно сделать отдельную функцию обхода дерева) можете помочь) или пример)) #include <iostream.h> ...

обход дерева - C++
struct SAcson { int l,c; // строка, столбец float x; // заряд bool e; // возбуждающий или тормозящий }; struct SSinapc { ...

обход дерева - C++
Здравствуйте! У меня вопрос: Есть класс: class D { vector <A*> count; }; ...

Ускорить обход дерева - C++
Во входном файле ancestor.in в первой строке содержится количество узлов дерева, во второй строке массив чисел i-ое из которых определяет...

Обход произвольного дерева - C++
struct tree { char info; struct tree *left; struct tree *right; }; так, вопрос глупый -меня просто сомнения берут. вот...

Обход дерева Хаффмана - C++
Добрый вечер. Имеем кодовое дерево Хаффмана.(в изображении) До каждого узла данного дерева есть путь из 0 и 1 . Для узла 12 ,...

Нерекурсивный обход дерева - C++
я не могу понять как сделать не рекурсивный обход дерева. понятно что надо добавлять элементы куда-то.в стек например. но я не знаю как...

Обход дерева в ширину - C++
Кто нибудь может скинуть мне программу обхода дерева в ширину?

Обход дерева по образцу - C++
Помогите осуществить обход дерева по образцу.

Обход n-арного дерева - C++
вопрос какой алгоритм использовать в плане КАК? знаю как хранить и как обходить, но алгоритм Лево Корень Право, а тут распечатывать...

Обход дерева в ширину - C++
имеется такой кусок программы. требуется обойти дерево в ширину. библиотека #include <queue> подключена void...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
softonet
32 / 32 / 2
Регистрация: 17.04.2011
Сообщений: 201
03.05.2012, 18:21     Обход дерева #2
Существует 3 вида обхода дерева: прямой, обратный и концевой.

1) Прямой обход дерева
- попасть в корень
- пройти левое поддерево
- пройти правое поддерево

2) Обратный обход дерева
- пройти левое поддерево
- попасть в корень
- пройти правое поддерево

3) Концевой обход дерева
- пройти левое поддерево
- пройти правое поддерево
- попасть в корень
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
В силу рекурсивности струтктуры двоичного дерева, реализация алгоритма обхода очень проста.
 
Прямой
 
 
struct Node{
char *info; // информация, располагаемая в узле дерева
Node *left; // указатель на левое поддерево
Node *right; // указатель на правое поддерево
};
int cnt; // порядковый номер узла дерева в процессе обхода
 
 
void straight(Node *root)
{
if(!root)
return;
/* здесь выполняется необходимая обработка корня – например, вывод информации в выходной поток */
printf("%d. \"%s\"\n", ++cnt, root->info);
/* обход левого поддерева */
straight(root->left);
/* обход правого поддерева */
straight(root->right);
}
 
 
Обратный
 
struct Node{
char *info; /* информация, располагаемая в узле дерева */
Node *left; /* указатель на левое поддерево */
Node *right; /* указатель на правое поддерево */
};
int cnt;
 
void reverse(Node *root)
{
/* если дерево пусто, не выполнять никаких действий – обход дерева завершается
*/
if(!root)
return;
/* обход левого поддерева */
reverse(root->left);
/* здесь выполняется необходимая обработка корня – например,
вывод информации в выходной поток */
printf("%d. \"%s\"\n", ++cnt, root->info);
/* обход правого поддерева */
reverse(root->right);
}
 
 
Концевой
 
struct Node{
char *info; /* информация, располагаемая в узле дерева */
Node *left; /* указатель на левое поддерево */
Node *right; /* указатель на правое поддерево */
};
int cnt;
 
void tail(Node *root)
{
/* если дерево пусто, не выполнять никаких действий – обход дерева завершается
*/
if(!root)
return;
/* обход левого поддерева */
tail(root->left);
/* обход правого поддерева */
tail(root->right);
/* здесь выполняется необходимая обработка корня – например,
вывод информации в выходной поток */
printf("%d. \"%s\"\n", ++cnt, root->info);
}
thick_int
Заблокирован
03.05.2012, 18:24  [ТС]     Обход дерева #3
Ну это понятно то. Хотелось бы, так сказать, увидеть "физический смысл" каждого типа обхода, чтобы понять, когда и зачем какой из них применять.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru