Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.06.2016, 17:01   #1
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию Поиск в двоичном дереве

Добрый день. Нужно построить англо-русский словарь как двоичное дерево. Каждая компонента содержит английское слово, соответствующее ему русское слово и счетчик количества обращений к данной компоненте. Дальше нужно сформировать новое представление словаря в виде двоичного дерева по следующему алгоритму:
а) в старом словаре ищется компонента с наибольшим значением
счетчика обращений;
б) найденная компонента заносится в новый
словарь и удаляется из старого;
в) переход к п. а) до исчерпания исходного словаря;
Пока что есть добавление узлов в дерево, возникли проблемы с поиском максимального счетчика и вывода дерева.
Код:
#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;
}
Вероника99 вне форума Ответить с цитированием
Старый 22.06.2016, 19:55   #2
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию

С эти разобралась. Подскажите тогда,пожалуйста, на счет удаления узла, написала следующую функцию, но она не удаляет узел.Вроде все по правилам делала
Код:
void DeleteNode(tree*root,tree*p)
{
    tree *p_new,*pp;
    if(p->left==NULL&&p->right==NULL)
    {
        p=NULL;
        return;
    }
    else if(p->right==NULL)
    {
        p=p->left;
        return;
    }
    else if(p->left==NULL)
    {   p=p->right;
    return;
    }
    else
    {
        p_new=p->left;
        pp=p;
        while(p_new->right!=NULL)
        {
            pp=p_new;
            p_new=p_new->right;
        }
        p_new->right=p->right;
        if(pp!=p)
        {
            pp->right=p_new->left;
            p_new->left=p->left;
        }
    }
    p=p_new;
    
    free(p);
    return;
}
Код:
tree *p=seek_count(root,0);
    cout<<"Delete"<<endl;
    DeleteNode(root,p);
        print_tree (root, 0);
Вероника99 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск вызова библиотечной функции в двоичном коде Alex071 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 8 07.05.2013 17:44
Поиск в двоичном дереве. hgfdd Общие вопросы C/C++ 1 15.11.2012 01:32
Бинарный поиск в дереве c++ vvsmvps Фриланс 1 23.05.2011 10:44
Рекурсивный алгоритм поперечного обхода в двоичном дереве поиска ( С++ ) Madara88 Помощь студентам 0 06.05.2011 10:04
Сколько раз повторяется элемент в двоичном дереве? Maksik Помощь студентам 1 21.06.2010 17:03