Премини към съдържанието

Препоръчан отговор


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

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

#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, а това не е вярно.

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

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Някой може ли да ми помогне с това как се прави изключващо ИЛИ в count1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
int count1(elem *t)
{ 
  if (t==NULL) return 0; 
  return count1(t->left)+count1(t->right)+(t->left==NULL)^(t->right==NULL);
}

 


  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

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

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 14 часа, Ммм написа:

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

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

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

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

  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 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, са с нисък приоритет и се изпълняват най-накрая, затова трябва да се използват правилно скобите.

  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
публикувано (редактирано)

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

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

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Регистрирайте се или влезете в профила си за да коментирате

Трябва да имате регистрация за да може да коментирате това

Регистрирайте се

Създайте нова регистрация в нашия форум. Лесно е!

Нова регистрация

Вход

Имате регистрация? Влезте от тук.

Вход

×

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите условия за ползване.