Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/22: Рейтинг темы: голосов - 22, средняя оценка - 4.59
 Аватар для TheAthlete
174 / 170 / 19
Регистрация: 31.08.2010
Сообщений: 575

Англо-русского словарь методом дерева бинарного поиска

20.04.2011, 17:27. Показов 4195. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Есть задача: реализовать англо-русский словарь с помощью бинарного дерева поиска. Решаю эту задачу на примере книги "Алгоритмы на С++ Роберт Седжвик".
Часть уже реализовал:

Item.h - АТД (абстрактный тип данных) элемента, содержит ключ (Key) - английское слово, соответствующее ему русское слово (item) и счетчик (количество обращений к ключу)

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
#ifndef ITEM_H
#define ITEM_H
 
#include <iostream>
#include <string>
 
typedef std::string Key;
 
class Item
{
    friend std::ostream &operator<<(std::ostream &os, const Item &x);
    friend std::istream &operator>>(std::istream &in, Item &x);
    friend bool operator==(const Item &lhs, const Item &rhs);
    friend bool operator<(const Item &lhs, const Item &rhs);
public:
    Item(const size_t c = 0) : Count(c) {}
    Item(const Key &itsKeyval, const std::string &itsInfo, const size_t c = 0) : keyval(itsKeyval), info(itsInfo), Count(c) {}
    ~Item() {}
 
    Key key()           const { Count++; return keyval; }
    std::string item()  const { return info; }
    bool null()         const { return keyval.empty(); }
    int count()         const { return Count; }
    
    bool scan(const Key &itsKeyval, const std::string &itsInfo, const size_t c);
    void show(std::ostream &os = std::cout) { os << keyval << " " << info << " " << Count << std::endl; }
 
private:
    Key keyval;
    std::string info;
    mutable size_t Count; // позволяет изменять переменную даже в константной функции-члене
};
 
#endif
Item.cpp

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
#include "Item.h"
#include <iostream>
 
using std::istream;
using std::ostream;
using std::string;
 
bool Item::scan(const Key &itsKeyval, const std::string &itsInfo, const size_t c) {
    Count = c;
    keyval = itsKeyval;
    info = itsInfo;
    return !keyval.empty() && !info.empty();
}
 
ostream &operator<<(ostream &os, const Item &x) {
    os << x.keyval << " " << x.info << " " << x.Count;
    return os;
}
 
istream &operator>>(istream &in, Item &x) {
    in >> x.keyval >> x.info >> x.Count;
    if (!in) x = Item(); // ввод неудачен: вернуть объект в стандартное состояние
    return in;
}
 
bool operator==(const Item &lhs, const Item &rhs) {
    return lhs.keyval == rhs.keyval;
}
 
bool operator<(const Item &lhs, const Item &rhs) {
    for(string::size_type ix1 = 0, ix2 = 0; ix1 != lhs.keyval.size() && ix2 != rhs.keyval.size(); ++ix1, ++ix2) {
        return lhs.keyval[ix1] < rhs.keyval[ix2];
    }
}
ST.h - Таблица символов на основе дерева бинарного поиска

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
#ifndef ST_H
#define ST_H
 
#include <iostream>
 
template<typename Item, typename Key>
class ST
{
public:
    ST() : head(0) {}
    ~ST() {}
 
    Item search(Key v) { return searchR(head, v); }
    void insert(Item x) { insertR(head, x); }
    void show(std::ostream &os) { showR(head, os); }
    void remove(Item x) { removeR(head, x.key()); }
    
private:
    struct node {
        Item item;
        node *l, *r;
        node(Item x) : item(x), l(0), r(0) {}
    };
    
    typedef node *link;
    
    link head;
    Item nullItem;
 
    Item searchR(link h, Key v) {
        if (h == 0) return nullItem;
 
        Key t = h->item.key();
 
        if (v == t) 
            return h->item;
 
        if (v < t)
            return searchR(h->l, v);
        else
            return searchR(h->r, v);
    }
 
    void insertR(link &h, Item x) {
        if (h == 0) {
            h = new node(x);
            return;
        }
        if (x.key() < h->item.key())
            insertR(h->l, x);
        else
            insertR(h->r, x);
    }
 
    void showR(link h, std::ostream &os) {
        if (h == 0) return;
        showR(h->l, os);
        h->item.show(os);
        showR(h->r, os);
    }
 
    // Ротации в BST-деревьях
    void rotR(link &h) {
        link x = h->l;
        h->l = x->r;
        x->r = h;
        h = x;
    }
    
    void rotL(link &h) {
        link x = h->r;
        h->r = x->l;
        x->l = h;
        h = x;
    }
 
    // Разбиение BST-дерева
    void partR(link &h, int k) {
        int t = (h->l == 0) ? 0 : h->l->N;
        if (t > k) {
            partR(h->l, k);
            rotR(h);
        }
        if (t > k) {
            partR(h->r, k - t - 1);
            rotL(h);
        }
    }
 
    link joinLR(link a, link b) {
        if (b == 0) return a;
        partR(b, 0);
        b->l = a;
        return b;
    }
 
    void removeR(link &h, Key v) {
        if (h == 0) return;
        Key w = h->item.key();
        if (v < w) removeR(h->l, v);
        if (w < v) removeR(h->r, v);
        if (v == w) {
            link t = h;
            h = joinLR(h->l, h->r);
            delete t;
        }
    }
};
 
#endif
Внимание вопрос: при реализации разбиения BST-дерева (другое названиие бинарного дерева поиска) (метод Item partR(link &h, int k)), предполагается, что каждый узел дерева содержит размер своего поддерева (в данном методе это элемент h->l->N)

Я так полагаю, что необходимо добавить элемент N в структуру node:

C++
1
2
3
4
5
6
struct node {
        Item item;
        node *l, *r;
                      int N;
        node(Item x) : item(x), l(0), r(0), N(0) {}
    };
Только не пойму никак как определить размер поддерева для узла и тем самым записать это значение в N.

Зарание спасибо!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.04.2011, 17:27
Ответы с готовыми решениями:

Англо-русский словарь в виде двоичного дерева
Строки 105 и 60, ошибки С4703 и С4700 соответственно. Задача:Каждая компонента содержит английское слово, соответствующее ему русское...

Англо-русский словарь построен в виде двоичного дерева в программе с++
Англо-русский словарь построен в виде двоичного дерева. Каждая компонента содержит английское слово, соответствующее ему русское слово и...

Словарь на основе бинарного дерева
Объясните, пожалуйста, что делает программа в функциях push и как осуществляется поиск, не совсем понимаю, для чего нужны l,r. Получается ,...

2
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
21.04.2011, 02:38
TheAthlete, глубина поддерева в текущем узле — это максимальная из глубин поддеревьев этого узла + 1. Если поддерева нет, то есть указатель нулевой, то и глубина этого поддерева считается нулевой.
Соответственно, устанавливается эта глубина при каждом изменении в структуре дерева. Это дело нужно отслеживать и правильно обрабатывать.
0
0 / 0 / 0
Регистрация: 01.06.2014
Сообщений: 1
01.06.2014, 15:25
Написать рекурсивную функцию, которая устанавливает значение счетчика для узла = сумма счетчиков левого и правого узла + 1 и вызывать ее когда узел меняет местоположение. В частности вызывать ее в методах rotR, rotL для обоих узлов
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.06.2014, 15:25
Помогаю со студенческими работами здесь

Создание бинарного дерева поиска
Людииииии помогите пож-таааа.....Нужно создать бинарное дерево поиска, считывая элементы из текст файла.. Очень нужноооо:( кто нибудь:(:(...

Распечатка бинарного дерева поиска
Много где висит функция void print(int deep, ptree p) { if(p) { print(deep + 1, p-&gt;l); for ( int i = 0; i &lt; deep; i...

Высота бинарного дерева поиска
Что неправильно в программе? Полное условие #include &lt;iostream&gt; #include &lt;cstdio&gt; #pragma comment (linker,...

Итератор дерева бинарного поиска
Если у нас в качестве коллекции выступают вектора, очереди, стеки и т.п. то там вроде бы всё понятно инкремент, декремент итератора...

Реализация бинарного дерева поиска
Не выводит значения узлов деревьев, как я понял происходит утечка памяти, но я не пойму, что нужно сделать. Программа ошибку не выдаёт....


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru