7 / 7 / 5
Регистрация: 25.03.2018
Сообщений: 376
1

Заполнение бинарного дерева от 3 по n строк

15.10.2018, 21:02. Показов 430. Ответов 0
Метки нет (Все метки)

Приветствую! Столкнулся с такой проблемкой: задание про арифм. операции из дерева, но с этим я справлюсь, я только не могу понять, как начать считывать данные из файла начиная с 3 строки(т.е. 1ю и 2ю строки у меня нормально заносит в дерево, а след. троки игнорируются). Вот код:
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
#include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
 
int tabs = 0;   //Для создания отступов
                //Кол-во отступов высчитывается по кол-ву рекурсивного вхождения при выводе в фукцию print
/// Структура т.н. "ветки" бинарного дерева:
struct Branch {
 
    string Data;            // Переменная(кипер), которая будет прогонять через себя символы, читаемые из текстового файла;
    Branch *LeftBranch;     // Левая ветвь;
    Branch *RightBranch;    // Правая ветвь;
};
/// Функция чтения (и добавления) ветви из тесктовика:
void ReadFromFile(string sym, Branch *&branch, int i) {
    // Если ветки не существует:
    if (!branch) { 
 
        branch = new Branch;        // Создаём новую ветку типа структуры "Ветка";
        branch->Data = sym;         // Данная ветка станет корнем для следующих;
        branch->LeftBranch = 0;     // Обнуляем указатель на левую ветвь;
        branch->RightBranch = 0;    // Обнуляем указатель на правую ветвь;
        return;
    }
    // Иначе добавим ветку:
    else {
 
        char side = '0';    // Флаг, благодаря которому можно будет узнать, к какой ветви будет принадлежать переменная;
        // Цикл, который проходит по строке в поисках ветвей:
        for (i; i < sym.size(); i++) {
            // Если найден знак '!', то флаг указывает на левую ветвь:
            if (sym[i] == '!') side = 'L';
            // Если найден знак '"', то флаг указывает на правую ветвь:
            else if (sym[i] == '$') side = 'R';
            // Если найдено какое-либо число:
            else if (sym[i] >= '0' || '9' <= sym[i]) {
 
                string point;           // Строка, куда поместится число;
                // Пока не встретится пробел или символ новой строки:
                while (sym[i] != '\n' && sym[i] != ' ' && sym[i] < sym.size()) {
 
                    point += sym[i];    // Добавляем цифру к строке, которую потом передадим;
                    i++;                // Наращивание счётчика строки;
                }
                // Если по итогу это правая ветвь:
                if (side == 'R') ReadFromFile(point, branch->RightBranch, i);
                // Если по итогу это левая ветвь:
                else ReadFromFile(point, branch->LeftBranch, i);
                // Очистка строки:
                point.clear();
            }
            // Если найдено арифметическое действие:
            else if (sym[i] == '*' || sym[i] == '/' || sym[i] == '+' || sym[i] == '-') {
 
                string point;           // Строка, куда поместится число;
 
                point = sym[i];
 
                // Если по итогу это правая ветвь:
                if (side == 'R') ReadFromFile(point, branch->RightBranch, i);
                // Если по итогу это левая ветвь:
                else ReadFromFile(point, branch->LeftBranch, i);
                // Очистка строки:
                point.clear();
            }
        }
    }
}
/// Функция вывода дерева:
void Print(Branch *branch) {
 
    if (!branch) return;        // Если ветки не существует - выходим. Выводить нечего
    tabs++;                     // Иначе увеличим счетчик рекурсивно вызванных процедур
                                // Который будет считать нам отступы для красивого вывода
 
    Print(branch->LeftBranch);  // Выведем ветку и ее подветки слева
 
    for (int i = 0; i < tabs; i++) cout << " "; // Потом отступы
    cout << branch->Data << endl;               // Данные этой ветки
 
 
    Print(branch->RightBranch); // И ветки, что справа
 
    tabs--;                     // После уменьшим кол-во отступов
    return;
}
/// Главная функция, отправная точка:
void main() {
    
    ifstream fin("tree.txt", ios_base::in);         // Специальная переменная для чтения из файла;
    Branch *Root = 0;                               // Указатель типа "Ветви";
    string branches;                                // Строка для чтения ветвей;
    int count = 0;                                  // Счётчик ветвей(включая корень);
 
    // Цикл заполнения дерева:
    while (!fin.eof()) {
 
        int i = 0;
 
        // Если это голова:
        if (!count) {
 
            getline(fin, branches, '\n');               // Считываем строку;
            ReadFromFile(branches, Root, i);            // Вызов функции заполнения дерева;
            branches.erase(0, branches.length() + 1);   // Очищаем строку;
            count++;
        }
        // Если голова уже была:
        else {
 
            getline(fin, branches, '\n');               // Считываем строку;
            ReadFromFile(branches, Root, i);            // Вызов функции заполнения дерева;
            branches.erase(0, branches.length() + 1);   // Очищаем строку;
        }
    }
    // Функция вывода дерева:
    Print(Root);
    system("pause");
}
Я дебажил, и заметил, что при проходе по третей строке, у меня не заходит уже в if(!branch) т.к. Левая/Правая ветви почему-то не обнулены уже.... Как исправить можно?
Пример входных данных:
+
!- $/
!!* !$2 $!4 $$2
!!!1 !!$2
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.10.2018, 21:02
Ответы с готовыми решениями:

Заполнение бинарного дерева из файла
Есть задание. Используя классы , создать бинарное дерево. +готово, но пока через структуру-потом...

Заполнение особого бинарного дерева
Собственно класс бинарного дерева я прописал (хоть и криво, не в этом дело). Но метод вставки не...

Запись бинарного дерева в файл и восстановление из него этого дерева
Задача такая: есть бинарное дерево. Каждый элемент дерева содержит 3 указателя - 1 указатель на...

Написать шаблон бинарного дерева с функцией распечатки дерева
Не понимаю, что от меня хотят. Дано такое задание: Написать шаблон бинарного дерева с функцией...

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.10.2018, 21:02
Помогаю со студенческими работами здесь

Создание бинарного дерева из бинарного файла
struct Bin { string name; string city; int players; int score; }; void...

Построение бинарного дерева на основе не бинарного
В лабораторной работе есть такое задание: Создайте процедуру построения бинарного дерева на основе...

Вывод бинарного дерева на экран в виде "дерева"
основная задача: подсчет количества листьев. проблема: при просмотре хочу выводить бин. дерево, в...

Обход бинарного дерева С++
Нужна помощь! Просмотрел много источников, но так и не нашёл своего ответа...Суть задачи состоит в...

Удаление из бинарного дерева
Здравствуйте! Помогите с удалением узла из бинарного дерева. Номер узла вводится пользователем ...

Копирование бинарного дерева
Имеется бинарное дерево типа class TreeNode { public: TreeNode(); //конструктор virtual...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru