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

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

Войти
Регистрация
Восстановить пароль
 
roma_m
0 / 0 / 0
Регистрация: 18.02.2014
Сообщений: 36
#1

Помогите сделать обход двоичного дерева - C++

06.08.2014, 23:50. Просмотров 361. Ответов 5
Метки нет (Все метки)

Есть некий проект (большой, несколько файлов), где происходит процессы со списком (добавление, удаление и т. д.).
Структура:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
 * Структура list_node описывает элемент списка
 */
typedef struct l_node{
    void *data;        // Указатель на данные
    l_node *next;      // Указатель на следующий элемент
} list_node;
 
/**
 *Структура student описывает информацию о элементе списка
 */
typedef struct {
    char name[50];
    int order;
    float average_point;
} student;
И возникает проблема вывода информации на консоль.
Делается это следующим образом:
- функции
C++ (Qt)
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
void list_reset(list_head *list){
    if(list==NULL){
        return;
    }
    list->current = NULL;
}
 
int list_move_next(list_head *list){
    if (list==NULL || list->head==NULL){
        return 0;
    }
    
    if (list->current==NULL){
        list->current = list->head;
        return 1;
    }
 
    list_node *node = list->current;
    if (node->next==NULL){
        return 0;
    }
    list->current = node->next;
    
    return 1;
}
 
void *list_current(list_head *list){
    if (list==NULL){
        return NULL;
    }
 
    list_node *node = list->current;
    if (node==NULL){
        return NULL;
    }
 
    return node->data;
}
- main
// Проход по списку и вывод на экран
C++ (Qt)
1
2
3
4
5
6
7
8
student *s;
            list_reset(&list); // Сбрасываем внутренний указатель списка
            while(list_move_next(&list)){ // Перемещаемся к следующему элементу
                s = (student*)list_current(&list); // Получаем данные тек. элем.
                printf("%s\t", s->name);
                printf("%d\t", s->order);
                printf("%f\n", s->average_point);
            }
Так вот, в чем суть. Пытаюсь написать двоичное дерево по похожей схеме.
Структура:
C++ (Qt)
1
2
3
4
typedef struct leaf{
        T *data;
        leaf *right, *left;
    }TLeaf;
И вроде сделал все правильно, но не могу перепрограммировать функцию
bool moveNext().

Помогите решить данную проблему. Хотя бы какой нибудь алгоритм.Спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.08.2014, 23:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Помогите сделать обход двоичного дерева (C++):

Обход двоичного дерева по уровням - C++
Доброго времени! Нужно реализовать нерекурсивный обход двоичного дерева поиска по уровням, я написал так: template<typename T> void...

Как можно совершить обход двоичного дерева нерекурсивно - C++
Доброго времени суток. Хочу поинтересоваться: как можно совершить обход двоичного дерева нерекурсивно(!!!), желательно с примерами или...

Пример двоичного дерева - C++
Здравствуйте! Возникла мысль попробовать реализовать двоичное дерево в c++ для этого решил сначала рассмотреть какие-нибудь примеры в...

Проверка корректности двоичного дерева - C++
Здравствуйте! Задача такая, Свойство двоичного дерева поиска можно сформулировать следующим образом: для каждой вершины дерева V...

Алгоритм реализации двоичного дерева - C++
Нужно написать реализацию двоичного дерева с использованием шаблонов в упрощенном виде следуя конвенциям STL контейнеров. Основные...

Удаление корня двоичного дерева - C++
двоичное дерево состоит только из ptr корень двоичного дерева как удалить этот корень?

5
CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 691
Записей в блоге: 1
07.08.2014, 10:00 #2
roma_m, а что эта функция должна делать? У дерева ведь нет «следующего» элемента. Вы можете разве что устроить какой-либо обход (LAR, LRA, в ширину и пр.). Это оно?
0
roma_m
0 / 0 / 0
Регистрация: 18.02.2014
Сообщений: 36
07.08.2014, 11:15  [ТС] #3
CyberSolver, эта функция, в первоначальном виде, для списка, перемещает указатель списка на следующий элемент. Да мне нужно устроить обход дерева, но так чтобы функция возвращала указатель на один из элементов дерева после ее вызова. И так для каждого элемента. Элементы не должны повторяться.
0
CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 691
Записей в блоге: 1
07.08.2014, 12:20 #4
Цитата Сообщение от roma_m Посмотреть сообщение
эта функция, в первоначальном виде, для списка, перемещает указатель списка на следующий элемент.
Я догадываюсь
Цитата Сообщение от roma_m Посмотреть сообщение
Да мне нужно устроить обход дерева, но так чтобы функция возвращала указатель на один из элементов дерева после ее вызова. И так для каждого элемента. Элементы не должны повторяться.
И про это я уже спросил, и даже ответил. Вам нужен пример кода?
0
igorrr37
1648 / 1276 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 7
07.08.2014, 17:47 #5
Такая "функция" уже существует и называется она итератор.
Вот пример реализации
создание дерева и подсчте элементов
0
CyberSolver
07.08.2014, 17:52     Помогите сделать обход двоичного дерева
  #6

Не по теме:

Цитата Сообщение от igorrr37 Посмотреть сообщение
Такая "функция" уже существует и называется она итератор.
Ну итератор всё ж объект. Хочет человек функцию — пусть будет функция.

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.08.2014, 17:52
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
6
07.08.2014, 17:52
Ответ Создать тему
Опции темы

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