Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 15.12.2015
Сообщений: 18
1

Обход нагруженного дерева (бора)

26.07.2016, 15:38. Показов 1855. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте,прошу помощи в объяснении как сделать обход такого дерева. В итоге должно вывести на екран: cat,car,it,is,all. В каждого узла может быть до 26 детей. У каждого узла указатели на детей храню в виде массива(если даст что то)
Вот то что получилось самому написать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
void prefix(EnglishTreeNode* current)
{
 
    if (current->Letter==NULL)
        return;
    cout <<current->Letter;
    if (current->flag == true) {
        cout << " ";
    }
    for(int i=0;i<current->massSize;i++)
    prefix(current->LetterMass[i]);
}
в итоге если в дереве есть слова cat и car, на екран выведет cat ar. переменная flag дает понять является ли данный узел концом слова.LetterMass[i]-это дети currentа. massSize-количество детей у currenta.
Миниатюры
Обход нагруженного дерева (бора)  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.07.2016, 15:38
Ответы с готовыми решениями:

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

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

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

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

6
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
27.07.2016, 09:51 2
Если flag обозначает конец, то зачем нужно проверять на NULL?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void prefix(EnglishTreeNode* current)
{
    if (current->Letter==NULL)
        return;
    if (current->flag == true) {
        cout << " ";
    }
    for(int i=0;i<current->massSize;i++)
    {
        cout <<current->Letter;
        prefix(current->LetterMass[i]);
    }
}
0
0 / 0 / 0
Регистрация: 15.12.2015
Сообщений: 18
27.07.2016, 11:50  [ТС] 3
flag обозначает конец слова.Но это слово может быть составляющим другого слова.
Например: car(конец этого слова узел r) но после car,может идти продолжение другого слова,например carrier. А вот у детей узла r в слове carrier,Letter будет NULL,что будет обозначать, что carrier не является составляющей другого слова. Поэтому проверка на NULL.
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,713
27.07.2016, 13:05 4
nmcf, illision1,
Цитата Сообщение от illision1 Посмотреть сообщение
if (current->flag == true) {
Опять масло масляное
C++
1
if (current->flag) {
0
0 / 0 / 0
Регистрация: 15.12.2015
Сообщений: 18
27.07.2016, 13:42  [ТС] 5
я только учусь)

Добавлено через 9 минут
Может кто будет искать, то вот пока что написал функцию добавления слова в дерево и поиск слова по дереву.
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
struct EnglishTreeNode {
    EnglishTreeNode* LetterMass[26]; //массив указателей на детей
    char Letter;// Буква Узла
    bool flag;//Узел промежуточный или конечный(False,True)
    string word;//английское слово
    string translation;//перевод на русский язык если узел конечный
    string AlternativTranslation;//Альтернативные переводы
    short massSize;//размер LetterMass
};
EnglishTreeNode* nodeEnglishInit() {
    EnglishTreeNode *someNode = new EnglishTreeNode;
    someNode->Letter = ' ';
    someNode->word = "";
    someNode->flag = false;
    someNode->translation = "";
    someNode->massSize = 0;
    return someNode;
}
EnglishTreeNode* initEnglishWord() {
    EnglishTreeNode* someNode = nodeEnglishInit();
    static short i = 0;
    static ifstream file;
    if (i == 0) {
        file.open("Translations.txt");
        i++;
    }
    string tmp;
    file >> tmp;
    someNode->word=tmp;
    file >> tmp;
    someNode->translation=tmp;
    return someNode;
 
}
void addToEnglishTree(EnglishTreeNode* newNode, EnglishTreeNode* root) {
    EnglishTreeNode* current = root;
    string translationTmp = newNode->translation;//будет храниться перевод слова
    newNode->translation = "";//Зануляем перевод
    for (int i = 0; i < newNode->word.length(); i++) {//Цикл добавления всего слова
        if (current->massSize == 0) {
            for (int k = 0; k < 26; k++) {//Init детей currenta если это еще не было сделано
                current->LetterMass[k] = new EnglishTreeNode;
                current->LetterMass[k]->Letter = ' ';
                current->LetterMass[k]->word = "";
                current->LetterMass[k]->flag = false;
                current->LetterMass[k]->translation = "";
                current->LetterMass[k]->massSize = 0;
            }
        }
        bool flag = false;//Флаг нахождения буквы в детей currentа
        char tmpLetter = newNode->word[i];//Буква добавляемого слова
        int j;//Индекс поиска у детей currenta буквы добавляемого слова
        for (j = 0; j < 26; j++) {//Цикл поиска у детей currenta буквы добавляемого слова
            if (current->LetterMass[j]->Letter == tmpLetter) {
                flag = true;
                break;
            }
        }
        if (flag == true) {//если у ребенка currenta нашли нужную букву
            current = current->LetterMass[j];//делаем currentом ребенка с найденой буквой
        }
        else if(flag==false)//если у ребенка currenta не нашли нужную букву
        {
            current->LetterMass[current->massSize]->Letter = tmpLetter;//Создаем у ребенка currenta новую букву добавляемого слова
            current->massSize += 1;// Увеличиваем количество детей у currenta
            current = current->LetterMass[current->massSize-1];//делаем currentом ребенка с новой,добавленой буквой
        }
        if (i == (newNode->word.length() - 1)) {//Если текущий узел является конечным
            current->translation = translationTmp;
            current->flag = true;//Обозначаем текущий узел, что он является концом слова
        }
    }
}
void SearchTranslation(string word, EnglishTreeNode* root) {
    EnglishTreeNode* current = root;
    for (int i = 0; i < word.length(); i++) {//Цикл добавления всего слова
        bool flag = false;//Флаг нахождения буквы в детей currentа
        char tmpLetter = word[i];//Буква добавляемого слова
        int j;//Индекс поиска у детей currenta буквы добавляемого слова
        for (j = 0; j < 26; j++) {//Цикл поиска у детей currenta буквы добавляемого слова
            if (current->LetterMass[j]->Letter == tmpLetter) {
                flag = true;
                break;
            }
        }
        if (flag == true) {//если у ребенка currenta нашли нужную букву
            current = current->LetterMass[j];//делаем currentом ребенка с найденой буквой
        }
        if (i == word.length()-1&&current->flag==true) {//Если текущий узел является конечным и концом слова
            cout << current->translation;
        }
        if (i == word.length()-1&& current->flag == false||flag==false) {//Если текущий узел является конечным,но не концом слова или если у ребенка currenta не нашли нужную букву
            cout << "Данное слово отсутствует в словаре";
            break;
        }
        
        
    }
}
0
nmcf
27.07.2016, 22:05
  #6

Не по теме:

Цитата Сообщение от zss Посмотреть сообщение
Опять масло масляное
Ну это у него так.

0
0 / 0 / 0
Регистрация: 15.12.2015
Сообщений: 18
28.07.2016, 21:31  [ТС] 7
Функцию написал сам,закрывайте тему.
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
void showWordKakVgoogle(EnglishTreeNode* current,string word) {
    if (current->Letter == NULL)
        return;
    string word1 = word;
    for (int i = 0; i < current->massSize; i++) {
        if (current->LetterMass[i]->flag == false) {
            word1.push_back(current->LetterMass[i]->Letter);
            showWordKakVgoogle(current->LetterMass[i], word1);
        }
        if (current->LetterMass[i]->flag == true) {
            cout << word;
            cout << current->LetterMass[i]->Letter;
            cout << " ";
            word.push_back(current->LetterMass[i]->Letter);
            showWordKakVgoogle(current->LetterMass[i], word);
        }
        
    }
}
void KakVgoogle(EnglishTreeNode* root, string word) {
    EnglishTreeNode* current = root;
    for (int i = 0; i < word.length(); i++) {//Цикл поиска всего слова
        bool flag = false;//Флаг нахождения буквы в детей currentа
        char tmpLetter = word[i];//Буква слова,которое ищеться 
        int j;//Индекс поиска у детей currenta буквы слова,которое ищеться 
        for (j = 0; j < current->massSize; j++) {//Цикл поиска у детей currenta буквы  слова,которое ищеться 
            if (current->LetterMass[j]->Letter == tmpLetter) {
                flag = true;
                break;
            }
        }
        if (flag == true) {//если у ребенка currenta нашли нужную букву
            current = current->LetterMass[j];//делаем currentом ребенка с найденой буквой
        }
 
        if (i == word.length() - 1) {//Если текущий узел является конечным
            if (current->massSize != 0) {
                showWordKakVgoogle(current, word);
            }
 
 
        }
    }
}
0
28.07.2016, 21:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.07.2016, 21:31
Помогаю со студенческими работами здесь

Обход дерева)
Прога работает) но сказали, что нужно сделать отдельную функцию обхода дерева) можете помочь)...

Обход дерева в ширину
Доброго времени суток. Нужно обойти бинарное дерево в ширину: struct TreePart { string data;...

Обход дерева в ширину
имеется такой кусок программы. требуется обойти дерево в ширину. библиотека #include &lt;queue&gt;...

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru