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

drzewo binarne, tworzenie korzenia (wytłumaczenie roli fragmentu kodu)

Object Storage Arubacloud
0 głosów
892 wizyt
pytanie zadane 18 sierpnia 2017 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)
edycja 18 sierpnia 2017 przez Jakub 0

hej, mam pewne pytanie, dodam  że rozumiem zasadę działania drzewa i kod jest napisany prze ze mnie . Może zanim dokładnie powiem co mam na myśli podam kod programu (tam jest zaznaczony fragment kodu którego sens tak średnio rozumiem): 

#include <iostream> //na wszleki wypadek podałem cały kod
#include <windows.h>
#include <conio.h>
 
using namespace std;
 
struct drzewo { 
    int dane;
    drzewo *lewy_potomek;
    drzewo *prawy_potomek;
};
 
drzewo *korzen = NULL; 
 
void add(int x, drzewo *&rodzic) { //wstaw nowy element
    if(rodzic==NULL) {
        rodzic = new drzewo;
        rodzic->dane = x;
        rodzic->lewy_potomek = NULL;
        rodzic->prawy_potomek = NULL;
        
        /// mam na mysli ten fragment kodu :/ 
        if(korzen==NULL){ //po co to skoru mamy to co jest o gory
        	korzen = rodzic;
		}
		/////////////////////////////////////
		
    } else { 
        if(x>=rodzic->dane) add(x,rodzic->prawy_potomek);
        if(x<rodzic->dane) add(x,rodzic->lewy_potomek);
    }
}

void inOrder(drzewo *rodzic){ //sortoeanie 
     if(rodzic){
     	inOrder(rodzic->lewy_potomek);
        cout<<rodzic->dane<<" ";
        inOrder(rodzic->prawy_potomek);
	 }
}
 
int main() {
 
    while(true) {
        cout<<"---MENU---"<<endl;
        cout<<"1. dodaj"<<endl;
        cout<<"2. sort"<<endl;
        cout<<"----------"<<endl;
 
        char z = getch();
 
        switch(z) {
            case '1': {
                int value;
                cout<<"value: ";
                cin>>value;
                add(value,korzen);
                break;
            }
            case '2': {
                cout<<"sort: ";
                inOrder(korzen);
                getch();
                break;
            }
        }
         
        system("cls");
    }
 
    return 0;
}

generalnie mamy rekurencyjną funkcję wstawiania elementu do struktury... Na początek wskaźnik na  korzeń drzewa wskazuje na NULL (bo korzenia jeszcze niema) . Potem w funkcji add dodajemy pierwszy element .I tu doszedłem do problemu ,niby wszystko jest ok, przy pierwszym wywołaniu początkowa wartość wskaźnika na korzeń jest równa NULL i tworzymy nowy element (powinien on się stać korzeniem bo jest wskaźnikiem na niego):

void add(int x, drzewo *&rodzic) { //wstaw nowy element
    if(rodzic==NULL) { //to fragment z funkcja add
        rodzic = new drzewo;
        rodzic->dane = x;
        rodzic->lewy_potomek = NULL;
        rodzic->prawy_potomek = NULL;
        

jednak po sprawdzeniu działania programu  korzeń dalej wskazywał na NULL ,siłą rzeczy dodałem taki warunek:

if(korzen==NULL){ //jezeli korzenia jeszcze "nie ma" (na nic nie wskazuje)
        	korzen = rodzic; //korzen stanie się tym nowo utworzonym obiektem
		}

Czyli jeżeli korzenia jeszcze nie mamy to on staje się tym nowo utworzonym obiektem (korzen=rodzic) . Po co jednak to skoro i tak rodzic jest wskaźnikem na korzeń i jego efekty działania powinny wpłynąć na niego (na korzeń)?? (drzewo *& rodzic -w main-> add(value,korzen))Wiem że pytanie może wydawać się nie jasne ale ciężko go sprecyzować ,jak coś jest  nie zrozumiałe to piszcie ,bardzo będę wdzięczny za wszelkie starania i pomoc :)

1 odpowiedź

+1 głos
odpowiedź 18 sierpnia 2017 przez j23 Mędrzec (194,920 p.)

Dobrze kombinujesz. IMO, odwoływanie się do wskaźnika korzen  wewnątrz add jest kompletnie zbędne.

komentarz 18 sierpnia 2017 przez Jakub 0 Pasjonat (23,120 p.)

dzięki z odpowiedź , ale jak niby 'napisać rekurencje' bez wskaźnika w nagłówku funkcji ??

if(x>=rodzic->dane) add(x,rodzic->prawy_potomek);
        if(x<rodzic->dane) add(x,rodzic->lewy_potomek);

 

komentarz 18 sierpnia 2017 przez Jakub 0 Pasjonat (23,120 p.)
*i czemu konieczny jest fragment kodu napisany w pytaniu?
1
komentarz 18 sierpnia 2017 przez j23 Mędrzec (194,920 p.)

Nie rozumiem pytania. korzen nie musi być globalny i nie musisz się do niego odwoływać z wnętrza add. Tak wystarczy:

int main() 
{
    drzewo *korzen = nullptr; 

    add(666, korzen); // to wywołanie ustawi korzen
    add(777, korzen);
    add(555, korzen);
    add(888, korzen);
    ...
}

 

komentarz 18 sierpnia 2017 przez Jakub 0 Pasjonat (23,120 p.)

a, dzięki . już to rozumiem :) Co do pytania to może być trochę pogmatwane więc jeszcze raz powiem co mam na myśli ...

drzewo *korzen = nullptr; 
 
    add(666, korzen); // to wywołanie ustawi korzen

jak sam napisałeś to wywołanie ustawi korzeń, powinno się to dziać automatycznie (no bo logiczne że pierwszym pustym elementem w drzewie jest właśnie korzeń),czemu w takim razie funkcja żeby działać po prawnie potrzebuje jeszcze  tego warunku ?:

if(korzen==NULL){ //jezeli korzenia jeszcze "nie ma" (na nic nie wskazuje)
            korzen = rodzic; //korzen stanie się tym nowo utworzonym obiektem
        }

jak dalej jest nie zrozumiałe to nie twoja wina ;), ale dzięki za pokazanie lepszej implementacji 

komentarz 18 sierpnia 2017 przez Jakub 0 Pasjonat (23,120 p.)
*no chyba że teraz zadziała bez niego ,sprawdzę to
1
komentarz 18 sierpnia 2017 przez j23 Mędrzec (194,920 p.)
No właśnie o tym piszę od początku. Ten warunek jest niepotrzebny.
komentarz 18 sierpnia 2017 przez Jakub 0 Pasjonat (23,120 p.)
Aaa... racja,  przeprasza że jestem taki nie ogarnięty ale mam dzisiaj widocznie kiepski dzień ;( ,dzięki jeszcze raz za pomoc

Podobne pytania

+1 głos
3 odpowiedzi 760 wizyt
pytanie zadane 26 lutego 2018 w C i C++ przez Kurczak Użytkownik (940 p.)
0 głosów
0 odpowiedzi 551 wizyt
pytanie zadane 19 stycznia 2019 w C i C++ przez profsor500 Użytkownik (610 p.)
0 głosów
2 odpowiedzi 269 wizyt
pytanie zadane 3 czerwca 2018 w C i C++ przez Roman1212 Początkujący (460 p.)

92,551 zapytań

141,393 odpowiedzi

319,522 komentarzy

61,936 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!

...