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

Liczenie rekurencyjnie wartosci w drzewie

VPS Starter Arubacloud
0 głosów
414 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,630 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 987 wizyt
pytanie zadane 25 grudnia 2019 w C i C++ przez Hubertius Bywalec (2,970 p.)
0 głosów
0 odpowiedzi 361 wizyt
pytanie zadane 20 listopada 2019 w C i C++ przez Ola Piątek Nowicjusz (240 p.)
0 głosów
2 odpowiedzi 286 wizyt
pytanie zadane 13 listopada 2019 w C i C++ przez Tawka Nowicjusz (200 p.)

92,454 zapytań

141,262 odpowiedzi

319,089 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...