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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.11.2016, 13:35   #1
Bombucho
Пользователь
 
Регистрация: 03.11.2016
Сообщений: 10
По умолчанию Операции над элементами бинарного дерева(заменить корневой и максимальный)

Всем привет, пробовал гуглить, но ничего внятного для себя не нашел...

Код:
#include <iostream>
#include <cstdlib>
using namespace std;
//Наша структура
struct node
{
    int info; 
    node *l, *r;//Левая и Правая часть дерева
};
 
node * tree=NULL; //Объявляем переменную, типа структура дерево
 
//запись элемента в дерево
void push(int a,node **t)
{
    if ((*t)==NULL) //Если дерева не существует
    {
        (*t)=new node; 
        (*t)->info=a; 
        (*t)->l=(*t)->r=NULL; 
        return ;
    }
       //если дерево существует
        if (a>(*t)->info) push(a,&(*t)->r); //Если аргумент а больше, кладем его вправо
        else push(a,&(*t)->l); //Если меньше,то влево
}
 
//вывод дерева
void print (node *t,int u) 
{
    if (t==NULL) return; 
    else //Иначе
    {
    print(t->l,++u);
    for (int i=0;i<u;++i) cout<<"|";
    cout<<t->info<<endl; т
    u--;
    }
    print(t->r,++u); 
}
 
 //подсчет максимального элемента
 node*  maximum(node *t,int)
 {
   
   while(t->r)
   {
   t=t->r;
   }
   return t;
 }
 

 
 
int main ()
{   
    int n; //Количество элементов
    int s; //элемент(число) дерева
    cout<<"Введите количество элементов  ";
    cin>>n;
 
    for (int i=0;i<n;++i)
    {
    cout<<"ведите число  ";
    cin>>s;
    push(s,&tree); 
    }
    cout<<"Бинарное дерево"<<endl;
    print(tree,0);
}
Bombucho вне форума Ответить с цитированием
Старый 14.11.2016, 14:43   #2
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию

Код:
 //подсчет максимального элемента
 node*  maximum(node *t,int)
 {
   
   while(t->r)
   {
   t=t->r;
   }
   return t;
 }
По-моему, это не то. Ты идёшь только по правым ветвям.

Тут, скорее,
Код:
node*  maximum(node *t,int)
{
   node* result = t;
   if(t->r){
     node* tmp = maximum (t->r);
     if(tmp->info > result->info)
          result = tmp;
   }
    if(t->l)
   {
      node* tmp = maximum(t->l);
      if(tmp ->info > result->info)
          result = tmp ;
   }
   if(t->info > result->info)
        result = t;
   return result;
}
И да, зачем push принимает на вход указатель на указатель?
a.k.a. Angelicos Phosphoros
Мой сайт
New man вне форума Ответить с цитированием
Старый 14.11.2016, 18:19   #3
Bombucho
Пользователь
 
Регистрация: 03.11.2016
Сообщений: 10
По умолчанию

Цитата:
Сообщение от New man Посмотреть сообщение
И да, зачем push принимает на вход указатель на указатель?
Но ведь нужно поменять местами максимальное, а максимальное это последнее число по правым ветвям,верно же?
Bombucho вне форума Ответить с цитированием
Старый 14.11.2016, 20:19   #4
Bombucho
Пользователь
 
Регистрация: 03.11.2016
Сообщений: 10
По умолчанию

Цитата:
Сообщение от New man Посмотреть сообщение
И да, зачем push принимает на вход указатель на указатель?
Банально выбивало ошибку...
Bombucho вне форума Ответить с цитированием
Старый 14.11.2016, 22:23   #5
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию

Цитата:
Сообщение от Bombucho Посмотреть сообщение
Но ведь нужно поменять местами максимальное, а максимальное это последнее число по правым ветвям,верно же?
Это неверно для дерева в общем случае.

Нигде в условии не сказано, что дерево имеет какую-то особую структуру.
a.k.a. Angelicos Phosphoros
Мой сайт
New man вне форума Ответить с цитированием
Старый 14.11.2016, 22:48   #6
Bombucho
Пользователь
 
Регистрация: 03.11.2016
Сообщений: 10
По умолчанию

А вот насчет замены корневого и максимального, нужно создавать новую функцию по замене или можно прямо в функции поиска максимального элемента?
Bombucho вне форума Ответить с цитированием
Старый 15.11.2016, 00:59   #7
Bombucho
Пользователь
 
Регистрация: 03.11.2016
Сообщений: 10
По умолчанию

Цитата:
Сообщение от New man Посмотреть сообщение
Это неверно для дерева в общем случае.
Нигде в условии не сказано, что дерево имеет какую-то особую структуру.
Ну ведь это обычное бинарное дерево и наверное логичнее будет пользоваться таким
Код:
node* maximum(node *t,int) 
{ 
while(t->r!=NULL) 
{ 
t=t->r; 
} 
return t; 
}
Но вопрос остается открыт , как поменять местами максимальный и корневой элемент.
Bombucho вне форума Ответить с цитированием
Старый 15.11.2016, 11:51   #8
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию

Что ты имеешь в виду под "обычным"?

Как минимум, то, что ты говоришь, не верно, так как у тебя максимум будет в корне. А значит, само дерево не обязательно отсортированное.
a.k.a. Angelicos Phosphoros
Мой сайт
New man вне форума Ответить с цитированием
Старый 15.11.2016, 12:48   #9
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Так у вас бинарное дерево - это двоичное дерево поиска, у которого все элементы левого поддерева меньше корня, а правого - больше?
Если так, то максимум - действительно самый правый элемент и поиск максимума выглядит правильным.
По поводу замены - тут два варианта:
1) Самый правый элемент является листом, т.е. у него нет и левого поддерева.
Тогда просто в левое поддерево ему суём текущий корень и назначаем максимум корнем (не забываем удалить максимум из правого поддерева его корня)
2) У максимума есть левое поддерево. Тут вот всё сложно может быть, как бы дерево перестраивать не пришлось.
pu4koff вне форума Ответить с цитированием
Старый 15.11.2016, 21:35   #10
Bombucho
Пользователь
 
Регистрация: 03.11.2016
Сообщений: 10
По умолчанию

Цитата:
Сообщение от New man Посмотреть сообщение
Что ты имеешь в виду под "обычным"?
Товарищ pu4koff более ясно выразил мою мысль(самый последний элемент правой части = максимальный).
Bombucho вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Высота бинарного дерева dido171 Помощь студентам 4 02.12.2014 13:30
Построение бинарного дерева LordAlex91 Общие вопросы C/C++ 2 18.02.2012 15:49
!!! ОБХОДЫ БИНАРНОГО ДЕРЕВА !!! aleks.halk Помощь студентам 0 03.04.2011 01:08
Создания бинарного дерева С++ Olya90 Помощь студентам 0 10.06.2009 18:58
Операции над максимальными элементами масссива ( С ) Dest Общие вопросы C/C++ 4 14.05.2009 17:50