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

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

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

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

06.08.2014, 23:50. Просмотров 335. Ответов 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().

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

C++ Симметрический обход дерева
C++ Обход произвольного дерева
C++ Алгоритм реализации двоичного дерева
C++ Нерекурсивный обход дерева
C++ Обход дерева Хаффмана
Удаление корня двоичного дерева C++
C++ Обход дерева в ширину
Обход дерева по образцу C++
C++ Как можно совершить обход двоичного дерева нерекурсивно
C++ Пример двоичного дерева
C++ Ускорить обход дерева
C++ Вывести все вершины двоичного дерева

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

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

Не по теме:

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

Yandex
Объявления
07.08.2014, 17:52     Помогите сделать обход двоичного дерева
Ответ Создать тему
Опции темы

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