Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Visual C++/MFC/WTL > Обход дерева (небинарного) |
Автор: metoflex 19.9.2010, 12:55 |
Здравствуйте! Второй день не могу спать спокойно, очень озадачен вопросом, как мне обойти все вершины дерева (CTreeCtrl) начиая с самой первой, причём обойти последовательно каждую ветку, т.к. мне потом нужно будет информацию упорядоченно сохранить в файл, а потом загрузить из него. Как сохранить и загрузить-придумал, а вот как обойти дерево, для сохранения данных каждого узла....ума не приложу... Дерево не бинарное. Предполагаю что необходимо выполнять рекурсивный обход , но как... Буду очень рад, если у кого есть уже готовый алгоритм обхода. Спасбо Огромное! |
Автор: Cheloveck 19.9.2010, 13:18 | ||
Вот я когда-то делал для рекурсивного обхода каталогов. По аналогии разберёшься, я думаю.
|
Автор: metoflex 19.9.2010, 13:35 |
Спасибо Огромное! Сейчас попробую разобраться! |
Автор: metoflex 19.9.2010, 14:13 | ||||
Создал функцию с параметрами:
Выдаёт ошибку:
Я так полагаю, что компилятор не может скопировать в функцию переменную n, типа CTreeCtrl , необходимо вызывать конструктор копирования, я полагаю, подскажите как исправить ошибку. Спасибо! |
Автор: Cheloveck 19.9.2010, 14:28 | ||||
Передавай объекты по ссылке. У меня в примере небольшая ошибка
надо. Соответственно тебе
CTreeCtrl тоже, наверное, const. |
Автор: metoflex 20.9.2010, 19:03 | ||
Спасибо Огромное! Всё получилось!) Кому надо, вот код:
|
Автор: Cheloveck 20.9.2010, 19:42 |
1. Это будет работать только один раз, так как i не обнуляется. 2. Это будет работать только с довольна малым количеством элементов дерева. С большим получешь переполнение стека, ибо рекурсия - зло! |
Автор: Earnest 20.9.2010, 19:59 | ||
Cheloveck, не пугай ты так. Чтобы рекурсия реально сожрала стек, нужно столько элементов, что виндоус треснет. Точнее, столько уровней вложенности, т.к. глубина рекурсии зависит именно от этого. Во всяком, случае, проблемы раньше начнутся в другом месте. Рекурсивные алгоритмы - естественны для рекурсивных структур. Если начнутся проблемы с производительностью\памятью, то рекурсивный алгоритм всегда можно развернуть через стек, но будет утрачена лаконичность кода, так что делать это стоит только при действительной необходимости, а не заранее и на всякий случай. А насчет первого пункта, там достаточно одного обнуления, и оно вроде есть. Но вообще, использование статической переменной - это глупость, конечно, к тому же совсем не нужная. Алгоритмы обхода дерева пишутся примерно по такой схеме:
|
Автор: Cheloveck 20.9.2010, 20:50 |
Точно, не заметил. Всё равно я против рекурсии без крайней необходимости. И то при условии, что точно известно максимальное количество итераций. Кстати, при обходе рекурсией каталога Windows у меня стек валился, кажется. |
Автор: Cheloveck 21.9.2010, 08:40 |
Но я не пользуюсь молотком там, где можно закрутить отвёрткой. Я к тому, что стек можно организовать и в куче самому. И такой стек не лопнет в один прекрасный момент. Возможно. Ибо это было давно, а код я сразу переписал, сейчас уже ничего не осталось. |
Автор: metoflex 21.9.2010, 23:30 | ||||
Спасибо Огромное за ваши отзывы, очень помогли! Взник еще один небольшой вопросик. Создал класс (который прикрепил к CTreeCtrl), вызываю метод этого класса:
Пишет ошибку такого толка: Нестатическая ссылка на член должна указывать относительно заданного объекта Если пишу так:
Съедает без ошибки. Почему так?? Спасибо! |
Автор: Cheloveck 21.9.2010, 23:40 | ||
Потому что TreeClass - это класс. Из класса (без объекта) можно вызывать только статические функции, то есть объявленные с модификатором static. Но такие функции, соответственно, не имеют доступа к членам класса. А к обычным функциям можно обращаться только через объект, ибо только объеет хранит все переменные. Обычно, разницу между объектом и классом объясняют так: класс - это разметка, по которой создаётся объект. Добавлено через 55 секунд Статические методы вызываются из класса через оператор двойное двоеточие
|
Автор: metoflex 21.9.2010, 23:48 |
То же самое сообщение выдаёт, если обращаюсь через ( :: ) Добавлено @ 23:51 Статические, как я понимаю, не могут внести изменения в объект, но я вызовом данной функции вызываю построение древа... она явно не static .... |
Автор: Cheloveck 22.9.2010, 09:43 |
Ну так это логично oO |
Автор: metoflex 22.9.2010, 12:42 |
Cheloveck, А как исправить?? Подскажи, пожалуйста! |
Автор: metoflex 22.9.2010, 14:08 |
Проблему поправил сам. Так: TreeClass tree; tree.InsertItem(); |
Автор: Cheloveck 22.9.2010, 16:34 |
metoflex, можешь же, когда захочешь думать сам =) |