• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Liczenie rekurencyjnie wartosci w drzewie

Object Storage Arubacloud
0 głosów
435 wizyt
pytanie zadane 25 sierpnia 2016 w C i C++ przez danielek110795 Użytkownik (820 p.)

Witam. Muszę dodać rekurencyjnie elementy do drzewa a następnie napisać funkcje również rekurencyjną, która zliczy sumę ich elementów. Dodać mi się udało, gorzej z sumą ;\ Albo liczy źle, albo zlicza tylko 1 element :| Dodam, że suma musi być przekazana przez parametr. Ktoś pomoże?

 

Oto kod:

#include <stdio.h>
#include <stdlib.h>

struct treenode
{
    int data;
    struct treenode *leftchild, *rightchild;
} *root;

void add (struct treenode **root, int data)
{
    if (*root==NULL)
    {
        *root = (struct treenode*)malloc(sizeof(struct treenode));
        if (*root)
        {
            (*root)->data=data;
            (*root)->leftchild=(*root)->rightchild=NULL;
        }
    }
    else
        if ((*root)->data>=data)
            add(&(*root)->leftchild, data);
        else
            add(&(*root)->rightchild, data);
}

void print (struct treenode *root)
{
    if (root)
    {
        print(root->leftchild);
        printf("%d\n", root->data);
        print(root->rightchild);
    }
}

void removetree (struct treenode **root)
{
    if (*root)
    {
        removetree(&(*root)->leftchild);
        removetree(&(*root)->rightchild);
        free(*root);
        *root=NULL;
    }
}

int liczsume (struct treenode *root, int suma)
{
    if (root)
    {
        suma=suma+root->data;
        liczsume(root->leftchild, suma=suma+root->data);
        liczsume(root->rightchild, suma=suma+root->data);
    }
    return suma;
}

int main()
{
    add(&root, 4);
    add(&root, 3);
    add(&root, 2);
    add(&root, 1);
    add(&root, 0);
    add(&root, 9);
    add(&root, 8);
    add(&root, 7);
    add(&root, 6);
    add(&root, 5);

    print(root);

    int suma=0;

    printf("Suma : %d", liczsume(root, suma));

    return 0;
}

 

 

komentarz 25 sierpnia 2016 przez Ehlert Ekspert (212,670 p.)

Zostałem zainspirowany xD Poczekaj napiszę swoją wersję. Zaimplementuje jeszcze sensowne dodawanie danych smiley

komentarz 25 sierpnia 2016 przez danielek110795 Użytkownik (820 p.)
No to czekam :D Dodawanie zrobiłem tak jak było to na zajęciach. A sumę umiem policzyć ale tylko z lewej albo prawej strony a z 2 na raz nie wychodzi :|
komentarz 26 sierpnia 2016 przez CzikaCarry Szeryf (75,340 p.)
No to zliczasz najpierw z prawej, potem z lewej i sumujesz :)
komentarz 26 sierpnia 2016 przez danielek110795 Użytkownik (820 p.)
Tyle, że jak tak robie to zlicza źle ^^
komentarz 26 sierpnia 2016 przez CzikaCarry Szeryf (75,340 p.)
Jak to zle? Jak policzy dobrze lewą, dobrze prawą i doda wierzchołek (bądź odejmie, gdy wierzchołek liczysz i do lewej i do prawej strony) wszystko powinno być ok :)

1 odpowiedź

+1 głos
odpowiedź 25 sierpnia 2016 przez damianMg4 Użytkownik (740 p.)
wybrane 26 sierpnia 2016 przez danielek110795
 
Najlepsza

Co prawda nie przekazuje sumy przez parametry, bo wcale jej nie przekazuje ale tak będzie najprościej.

int liczsume (struct treenode *root)
{
    if (!root)
    {
        return 0;
    }
    return liczsume(root->leftchild)+
        liczsume(root->rightchild)+root->data;
}

 

komentarz 26 sierpnia 2016 przez danielek110795 Użytkownik (820 p.)
Tyle, że ja muszę ją przekazać :D Ale za jakiś czas coś na tym spróbuje zrobić :D
komentarz 26 sierpnia 2016 przez danielek110795 Użytkownik (820 p.)
int liczsume (struct treenode *root, int suma)
{
    if (root==NULL)
        return 0;
    if (root)
        return liczsume(root->leftchild, root->data)+liczsume(root->rightchild, root->data) + root->data;
    return suma;
}

 

Jak coś mam coś takiego i liczy :D

1
komentarz 26 sierpnia 2016 przez damianMg4 Użytkownik (740 p.)

Liczy XD bo nigdy nie wykonuje instrukcji return suma; w Twoim kodzie parametr suma jest niewykorzystywany równie dobrze możesz go usunąć. Jedyna opcja to zastosować wskaźnik oto kod:

int liczsume (struct treenode *root, int* suma)
{
    if (!root)
    {
        return *suma;
    }

    liczsume(root->leftchild,suma);
    liczsume(root->rightchild,suma);
    *suma+=root->data;
    return *suma;
}

 

Podobne pytania

0 głosów
0 odpowiedzi 1,013 wizyt
pytanie zadane 25 grudnia 2019 w C i C++ przez Hubertius Bywalec (2,970 p.)
0 głosów
0 odpowiedzi 362 wizyt
pytanie zadane 20 listopada 2019 w C i C++ przez Ola Piątek Nowicjusz (240 p.)
0 głosów
2 odpowiedzi 288 wizyt
pytanie zadane 13 listopada 2019 w C i C++ przez Tawka Nowicjusz (200 p.)

92,556 zapytań

141,404 odpowiedzi

319,560 komentarzy

61,942 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...