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

Поиск в двоичном дереве - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Вычислить значение суммы используя оператор for http://www.cyberforum.ru/cpp-beginners/thread1768847.html
S= \sum \sum_{10}^{i=-10}1/i^3 i\neq 0 Помогите пожалуйста S= \sum_{10}^{i=-10}1/i^3 i\neq 0
C++ Гаражная стоянка Условие задачи: Гаражная стоянка имеет одну стояночную полосу, причем единственный въезд и единственный выезд находятся в одном конце полосы. Если владелец автомашины приходит забрать свой автомобиль, который не является ближайшим к выходу, то все автомашины, загораживающие проезд, удаляются, машина данного владельца выводится со стоянки, а другие машины возвращаются на стоянку в исходном... http://www.cyberforum.ru/cpp-beginners/thread1768843.html
Структура «Автобусный тур» C++
Структура «Автобусный тур» с полями «пункт назначения», «дата начала тура», «дата окончания тура», «количество человек в группе». Функция - расчёт количества автобусов (42 места), необходимых для перевозки группы. Мне нужно сделать типа как вот эта программа по такому же образу int f(int p,string k) { int l; if(k=="1"){ l=150*p; }
C++ Разряженный вектор произвольной длины
Помогите пожалуйста ответить на вопрос:"Определить набор операций и структуру данных для абстрактного типа данных «Разряженный вектор произвольной длины»".
C++ Структуры: отобразить на экран анкетные данные студентов-отличников в виде таблицы http://www.cyberforum.ru/cpp-beginners/thread1768805.html
Помогите разобраться как написать программу,вообще не понимаю алгоритм действий и как составить программу( Дан список учебной группы, включающий 20 человек. Для каждого студента известны: фамилия, имя, дата рождения, оценки по всем дисциплинам за последний семестр. Составить программу, которая обеспечивает ввод информации и отображение ее на экран в виде таблицы. ...
C++ Игра "Калах" Для выбора лунки, с которой делается очередной ход должны использоваться клавиши "←", "→". Ход определяется нажатием клавиши "SPACE". При нажати клавиши "н" на экран должны выводиться правила игры. Перед началом игры должны запрашиваться имена игроков. Как это можно реализовать? Правила игры: https://ru.wikipedia.org/wiki/Калах#.D0.9F.D1.80.D0.B0.D0.B2.D0.B8.D0.BB.D0.B0 подробнее

Показать сообщение отдельно
Вероника99
4 / 4 / 1
Регистрация: 16.12.2013
Сообщений: 417

Поиск в двоичном дереве - C++

22.06.2016, 17:00. Просмотров 150. Ответов 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
#include <iostream>
#include <string>
using namespace std;
 
string temp_eng;
string temp_rus;
int temp_count;
int lev=0;
struct tree
{
    string eng; //слово
    string rus; //слово
    int count; //количество обращений
    tree *left;
    tree *right;
};
// Функция создания первого элемента
// Функция фoрмирования первого элемента дерева:
tree *first (string temp_eng,string temp_rus,int temp_count)
{
    tree *pv=new tree;
    pv->eng=temp_eng;
    pv->rus=temp_rus;
    pv->count=temp_count;
    pv->left=0;
    pv->right=0;
    return pv;
}
 
// Функция поиска и добавления элемента в дерево:
tree *search_insert (tree *root, string temp_eng, string temp_rus,int temp_count)
{
    tree *pv=root, *prev;
    bool found=false;
    //поиск по дереву
    while (pv&&!found) 
    {
    prev=pv;
    if ((temp_eng==pv->eng)&&(temp_rus==pv->rus))
        found = true;
    else if (temp_count < pv->count)
        pv=pv->left;
    else pv=pv->right;
    }
    if (found) return pv;
    //создание нового узла
    tree *pnew=new tree;
    pnew->eng=temp_eng;
    pnew->eng=temp_rus;
    pnew->count=temp_count;
    pnew->left=0;
    pnew->right=0;
    if (temp_count < prev->count)
    prev->left=pnew; //присоединение к левому поддереву предка
    else prev->right=pnew; //присоединение к правому поддереву предка
    return pnew;
}
//функция поиска наибольшего счетчика
void seek_count (tree *root) //ПРОБЛЕМА ЗДЕСЬ
{
    tree *p=root;
    int max_l=0;
    while(p!=NULL)
    {
        if(max_l<p->count)
        {
            max_l=p->count;
        }
        else
            p=p->left; //еще нужен обход по правому узлу
 
    }
    cout<<"\n"<<max_l<<endl;
}
// Функция показа дерева
void print_tree (tree *p, int level) //И здесь проблема
{
    if (p)
    {
        print_tree(p->left, level+1);
        for (int i=0; i<level; i++)
        cout<<" ";
        cout<<p->eng<<endl;
            cout<<p->rus<<endl;
        for (int i=0; i<level; i++)
        cout<<" ";
        cout<<p->count<<endl;
        print_tree (p->right, level+1);
    }
    lev=level;
}
int main()
{
    tree *root=NULL;
    for(int i=0;i<2;i++)
    {
    cout<<"Vvedite angliskoe slovo: "<<endl;
    cin>>temp_eng;
        cout<<"Vvedite russkoe slovo: "<<endl;
    cin>>temp_rus;
    cout<<"Vvedite znachenie schetchika: "<<endl;
    cin>>temp_count;
    if(!root)
    {
        root=first(temp_eng,temp_rus,temp_count);
    }
    else 
        root=search_insert (root, temp_eng, temp_rus,temp_count);
    }
    print_tree (root, 0);
    seek_count(root);
    return 0;
}
Подскажите пожалуйста,как правильно перебираться все узлы дерева,чтобы найти в нем максимальный счетчик?Я запуталась немного
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 16:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru