Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

измерение глубины бинарного дерева

19K
13 мая 2007 года
spravochnaia
11 / / 08.12.2006
долго бьюсь над задачей - вычислить максимальную глубину данного бинарного дерева, но идеи алгоритмов возникают вообще нереализуемые, подскажите будьте добры как мне это сделать:\ ?

всёже родил один алгоритм, но не могу найти ошибки в коде, вот функции:
Код:
int max(int a, int b)
{
    if(a>b)
      return a;
    else
      return b;
}

int l_tree(TREE *s, int depth)// Функция измерения макс глубины дерева
{
    if(s->data==error)
    {
        printf("Tree is empty.\n");
        system("pause");
    }
    else
    {
        if(s==NULL)
           return depth;
        else
           return max(l_tree(s->left,depth+1),l_tree(s->right,depth+1));
    }
}
622
13 мая 2007 года
nilbog
507 / / 19.12.2006
проще всего рекурсивно
рекурсивно обрабатываем левую правую ветку
возвращаем наибольшее из этих чисел +1
нерекурсивный выход - отсутствие поддерева
можно и через стек - но по сути тоже самое
19K
13 мая 2007 года
spravochnaia
11 / / 08.12.2006
Цитата: nilbog
проще всего рекурсивно
рекурсивно обрабатываем левую правую ветку
возвращаем наибольшее из этих чисел +1
нерекурсивный выход - отсутствие поддерева
можно и через стек - но по сути тоже самое



Код:
int max(int a, int b)
{
if(a>b)
return a;
else
return b;
}

int l_tree(TREE *s, int depth)// Функция измерения макс глубины дерева
{
if(s->data==error)
{
printf("Tree is empty.\n");
system("pause");
}
else
{
if(s==NULL)
return depth;
else
return max(l_tree(s->left,depth+1),l_tree(s->right,depth+1));
}
}

вот, написал но она не работает:\
19K
13 мая 2007 года
spravochnaia
11 / / 08.12.2006
всё) нашёл ошибку
 
Код:
if(s->data==error)
{
    printf("Tree is empty.\n");
    system("pause");
}

- условие лишнее, из-за него и была ошибка:)
61K
20 мая 2010 года
John_Smail
2 / / 20.05.2010
Есть более простой способ, рекурсивно, хотя на вкус и цвет товарищей нет. но выложу алгоритм
 
Код:
int count(Tree *p, int c){

if(c>max) max=c;
if(p->left!=NULL) count(p->left, c+1);

if(p->right!=NULL) count(p->right, c+1);

return max;
}

думаю друзья БГУИРовцы поблагодарят меня=))
87K
19 декабря 2012 года
1 / / 19.12.2012
Не соглашусь с последним ответом: count возвращает тип int , и его надо куда-то сохранять. Не говоря уже о непонятно откуда взявшейся max. Идея привлекательная, но хотелось бы её немного отредактировать:
int count (tree*p, int c)
{
int a,b;
if (p->left) a=count(p->left, c+1);
if (p->right) b=count(p->right, c+1);

if (a>c) return a;
else if (b>c) return b;
else return c;
}
95K
23 марта 2015 года
Michael Margaryan
1 / / 23.03.2015
Значения a и b не указаны.
Точнее должно быть так:

Код:
int Depth (int d)
{
 int a=0,b=0;

if (this->l!=NULL)
 a = this->l->Depth(d++);
 if  (this->r!=NULL)
b= this->r->Depth(d++);

if (a>d && a>b) return a;
if (b>d) return b;
return d;

}
При вызове с драйвера нужно указать перво значение d= 0.
if (a>c) return a; неверно, поскольку глубина правой части может быть больше, чем левой.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог