Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

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

 

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

Featured Replies

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

Това съм направил. Искам да ми кажете дали е така, ако не къде имам грешка

#include <iostream>
using namespace std;

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

void preorder (elem *t)
{
        if(t)

        {cout<<t->key<<"\t";
        preorder(t->left);
        preorder(t->right);}

}

void inorder(elem *t)
{
        if(t)
        {
                inorder(t->left);
                cout<<t->key<<"\t";
                inorder(t->right);}
}

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

void postorder(elem *t)
{
        if(t)
        { postorder(t->left);
        postorder(t->right);
        cout<<t->key<<"\t";}
}


int height(elem * t)
{
    if (t == NULL)
       return -1;
    int u = height(t->left);
    int v = height(t->right);
    if (u > v)
       return u + 1;
    return v + 1;
}


void printnode(int n, int h)
{
        for (int i=0;i<h;i++)
                cout<<"\t";
        cout<<n<<endl;
}


void show(elem *t,int h)
{ if (t==NULL)
return;
show(t->right,h+1);
printnode(t->key,h);
show(t->left,h+1);
}


int count (elem *t)
{  if (t==NULL) return 0;  return count(t->left)+count(t->right)+1;}

 int count1(elem *t)
 { if (t==NULL) return 0; 
 if(t->left==NULL || t->right==NULL)
                 return count(t->left)+count(t->right)+1;
}
 

void main ()
{
        int a;
        cout<<"\n Vyvedi elementi na dyrvoto"<<endl;

do
        { cin>>a;
        if(a>0)
                add(a,root);
        }while(a>0);

int r=count(root);
cout<<"Broi vyzli "<<r<<endl;
int r1=count1(root);
cout<<"Broi vyz s edin naslednik "<<r1;
   cout<<endl;
   cout<<endl;
   show(root, 0);
}

 

преди 9 минути, petar96 написа:

Това съм направил. Искам да ми кажете дали е така, ако не къде имам грешка

В count1 трябва да ползваш изключващо ИЛИ. Иначе, примерно, ако сложиш един елемент в дървото, ще получиш резултат 1, а това не е вярно.

  • Автор
преди 10 минути, flare написа:

В count1 трябва да ползваш изключващо ИЛИ. Иначе, примерно, ако сложиш един елемент в дървото, ще получиш резултат 1, а това не е вярно.

Как ще стане това

Можете ли да ми кажете, ако искам да брои възлите с по два наследника, а не един, къде трябва да се направи поправка?

преди 14 часа, Ммм написа:

Можете ли да ми кажете, ако искам да брои възлите с по два наследника, а не един, къде трябва да се направи поправка?

Сменяш горе изключващото ИЛИ със И.

преди 54 минути, ined написа:

И получава грешен оговор :)

Обаче и възможност да помисли защо е така.

 

int count2(elem *t)
{ 
  if (t == NULL) return 0; 
  return count2(t->left) + count2(t->right) + (t->left != NULL && t->right != NULL);
}

Трябва да се внимава с приоритете на операторите. Логически и побитови оператори като ^ и &&, както и другите: &, I и II, са с нисък приоритет и се изпълняват най-накрая, затова трябва да се използват правилно скобите.

Правилно, аз се съмнявах как точно е реда на изпълнение, но така и не го проверих и съответно две от скобите трябва да се махнат иначе ще дава неверни отговори.

Редактирано от ined (преглед на промените)

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    25%
    Дарени 252.69 EUR от нужните 1,000.00 EUR

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.