Регистрация не е нужна, освен при създаване на тема в "Задача на седмицата".

Двоично дърво

Двоично дърво

Мнениеот Гост » 03 Май 2018, 09:23

Да се състави функция, която преброява възлите с по два наследника в дадено двоично дърво. Моля помогнете
Гост
 

Re: Двоично дърво

Мнениеот Добромир Глухаров » 03 Май 2018, 11:01

В тази програма:

Код: Избери целия код
#include <iostream>
#include <cstdlib>

using namespace std;

struct elem
{
    int key;
    elem *left, *right;
} *root = NULL;

void add(int n, elem* &t)
{
    if (t == NULL)
    {
        t = new elem;
        t->key = n;
        t->left = t->right = NULL;
    }
    else
    {
        if (t->key < n)
            add(n, t->right);
        else
            add(n, t->left);
    }
}

void search_counter(elem *t, int &counter)
{
    if (t != NULL)
    {
        if(t->right != NULL && t->left != NULL) counter++;
        search_counter(t->right, counter);
        search_counter(t->left, counter);
    }
}

int main()
{
    char narr[256];
    int n, counter=0;
    cout << "Number (0 for end) = ";
    cin >> narr;
    n = atoi(narr);
    while(n)
    {
        add(n, root);
        cout << "Number (0 for end) = ";
        cin >> narr;
        n = atoi(narr);
    }
    search_counter(root, counter);
    cout << "count = " << counter << endl << endl;
    system("PAUSE");
}


преброяващата функция е това:

Код: Избери целия код
void search_counter(elem *t, int &counter)
{
    if (t != NULL)
    {
        if(t->right != NULL && t->left != NULL) counter++;
        search_counter(t->right, counter);
        search_counter(t->left, counter);
    }
}
Аватар
Добромир Глухаров
Математик
 
Мнения: 2080
Регистриран на: 11 Яну 2010, 13:23
Рейтинг: 2178

Re: Двоично дърво

Мнениеот Гост » 08 Май 2019, 20:53

Здравейте!
Какво е "atoi();"?
Къде е дефинирано?
Гост
 

Re: Двоично дърво

Мнениеот Добромир Глухаров » 08 Май 2019, 21:19

Гост написа:Здравейте!
Какво е "atoi();"?
Къде е дефинирано?


atoi() (array to integer) е функция, превръщаща последователност от символи-цифри (array) в цяло число. Намира се в библиотеката cstdlib. В тази библиотека се намира също и функцията atof() (array to float), превръщаща последователност от символи (цифри и десетична точка) в число с плаваща запетая (float). Виж atoi, atof.
Аватар
Добромир Глухаров
Математик
 
Мнения: 2080
Регистриран на: 11 Яну 2010, 13:23
Рейтинг: 2178

Re: Двоично дърво

Мнениеот Гост » 08 Май 2019, 21:46

Това е резултата от променената функция за търсене на възел с един наследник, но струва ми се, че броенето започва от корена и не зачита следващите наследници. Дава нереални резултати , тоест за програмата са реални, но не е е това изискването.
Благодаря за бързия отговор преди това.
Код: Избери целия код
void counter(elem *t, int &counter)
{
   if (t != NULL)
   {
      if (t->right != NULL || t->left != NULL)
counter++;
      search_counter(t->right, counter);
      search_counter(t->left, counter);
      
   }
}
Гост
 

Re: Двоично дърво

Мнениеот Гост » 08 Май 2019, 21:48

Как да бъде преобразувана функцията правилно за търсене на възел с един наследник?
Гост
 

Re: Двоично дърво

Мнениеот Добромир Глухаров » 08 Май 2019, 22:09

Код: Избери целия код
void search_counter(elem *t, int &counter)
{
    if (t != NULL)
    {
        if(t->right == NULL && t->left != NULL
           || t->right != NULL && t->left == NULL)
                counter++;
        search_counter(t->right, counter);
        search_counter(t->left, counter);
    }
}
Аватар
Добромир Глухаров
Математик
 
Мнения: 2080
Регистриран на: 11 Яну 2010, 13:23
Рейтинг: 2178

Re: Двоично дърво

Мнениеот Гост » 08 Май 2019, 22:35

Сърдечно благодаря!
Гост
 


Назад към C, C++



Кой е на линия

Регистрирани потребители: Google [Bot]

Форум за математика(архив)