Avatar billede spurn Nybegynder
18. september 2002 - 08:43 Der er 11 kommentarer og
1 løsning

Preorder traversering af generel træstruktur (c#)

private void Rekursiv_Funktion(int parent_node)
{   
    SQLstreng = "SELECT * from Kategori WHERE parent = " + parent_node;

    // dataset nulstilles
    k_DataSet.Reset();

    // dataset fyldes
    SqlDataAdapter adapter = new SqlDataAdapter();
    adapter.SelectCommand = new SqlCommand(SQLstreng, DBF);
    adapter.Fill(k_DataSet, "Kategori");

    // datasettet ligges på stacken så det kan hentes igen ved tilbageløb   
    s.Push(k_DataSet.Copy());

    // hvor mange noder er der           
    antal_kategorier = k_DataSet.Tables["Kategori"].Rows.Count;

    // Slutnode
    if (antal_kategorier == 0)
    {   
       
    }
    else
    {
        for (int i = 0;i<antal_kategorier-1;++i)
        {
               
        // kalder funktionen recursivt
        Rekursiv_Funktion(Convert.ToInt32(k_DataSet.Tables["Kategori"].Rows[i]["Katid"]));
                   
        // da vi er tilbage i et tidligere kald, skal vi bruge det rigtige dataset
        s.Pop();
                         
        // datasettet nulstilles
        k_DataSet.Reset();

        // datasettet vil nu være som det var før
        k_DataSet = ((DataSet)s.Peek()).Copy();
        }   
    }
}

Funktionen skal bruges til at lave en preorder traversering af en generel træstruktur. Problemet ligger i at den går hele vejen ned i venstre side, og så hele vejen op igen til root og holder så. Det virker som om den ikke fortsætter i lækken når man kommer tilbage fra et af de tidligere kald.

Er der nogen der kan se hvad jeg gøre galt ?
Avatar billede spurn Nybegynder
18. september 2002 - 08:54 #1
______(11)_______
    /    |      \   
    (12)      (13)      (14)
    /        |          \   
  (15)(16)(17) (22)        (20)
  /\
(18)(25) 

Sådan ser strukturen ud i mit testtræ og hvis jeg udskriver info undervejs får jeg følgende:


vi er nu i knuden: 11
SELECT * from Kategori WHERE parent = 11

antal_kategorier er nu: 3
i er nu:(før vi kalder rekusivt) 0vi er nu i knuden: 12
SELECT * from Kategori WHERE parent = 12

antal_kategorier er nu: 3
i er nu:(før vi kalder rekusivt) 0vi er nu i knuden: 15
SELECT * from Kategori WHERE parent = 15

antal_kategorier er nu: 2
i er nu:(før vi kalder rekusivt) 0vi er nu i knuden: 18
SELECT * from Kategori WHERE parent = 18
slutnode

Vi er nu tilbage i et tidligere kald, knude 15

Vi er nu tilbage i et tidligere kald, knude 12

Vi er nu tilbage i et tidligere kald, knude 11
Avatar billede kichian Nybegynder
18. september 2002 - 15:47 #2
Du skal bruge en kø (que) til at implementere Preorder traversering.

Stakken bruges til in- og postorder traversering.
Avatar billede spurn Nybegynder
19. september 2002 - 10:06 #3
Jeg kan ikke lige se problemstillingen i at det skulle hjælpe mig, kan du ikke uddybe det lidt mere, det kan godt være jeg fumler rundt i om det er preorder eller hvad det er. Rækkefølgen skal være:

11-12-15-18-25-16-17-13-22-14-20
Avatar billede kichian Nybegynder
19. september 2002 - 10:33 #4
Jeg vil tro at en del af problemet er, at k_Dataset er global.

Og det var vist mig der glemte hvad et pre-order gennemløb var.
Avatar billede spurn Nybegynder
19. september 2002 - 10:38 #5
Og hvori ligger problemet der, da jeg jo ved tilbageløb nulstiller den og smider det gamle dataset ind igen fra stakken.. (gør jeg ikke ?)
Avatar billede kichian Nybegynder
19. september 2002 - 11:25 #6
antal_kategorier er global!!!!! Prøv selv at gæt hvad der sker nå du er løbet til ende i dit træ, og den kaldende funktion skal sammenligne:
for (int i = 0;i<antal_kategorier-1;++i)

Så næste gang du benytter dig af rekursive funktioner, så har du vel lært at globale variable er noget skidt, ie. svært at styre. Og det værste er at de gør funktionen meget sværere at gennemskue. Selv for den der skrev den ;-)

Hvis performence er vigtig for dig, så drop brugen af rekursive funktioner.
Avatar billede spurn Nybegynder
19. september 2002 - 11:38 #7
weeee nu begynder det at ligne noget, hvad gør jeg for at løse det. kan jeg flytte den et andet sted hen, eller er jeg nødt til at bruge en datastruktur til at gemme det undervejs
Avatar billede kichian Nybegynder
19. september 2002 - 11:53 #8
Prøv at bruge en lokal variabel, du kan evt kalde den antal_kategorier ;-)
Dvs at du i starten af din funtion skriver:
int antal_kategorier;
eller længere nede
int antal_kategorier = k_DataSet.Tables["Kategori"].Rows.Count;

Præcis lige som i Java.

For lige at summere op:
Der er INGEN problemer med køretids-stakken. lokale variable ER lokale variable, også i rekursive funktioner.

Læs, lær og gør brug af mit sidste svar!
Avatar billede kichian Nybegynder
19. september 2002 - 12:04 #9
Og for lige at udbyde:

Det er OK at din kategori-stak er global. Alle andre variable i din funktion bør være lokale.

I øvrigt er der ikke behov for en kategori-stak i det hele taget, netop fordi din implementering er rekursiv. Og derfor kender hvert funktionsniveau sine underkategorier.
Stakken kan bruges hvis du ønsker at samle træstrukturen op, for senere gennemløb.
Avatar billede spurn Nybegynder
19. september 2002 - 12:13 #10
nu nærmer vi os en løsning, jeg har fjernet den globale antal_kategorier og sagt int antal_kategorier = k_DataSet.Tables["Kategori"].Rows.Count; istedet, og får nu følgende output.

vi er nu i knuden: 11
SELECT * from Kategori WHERE parent = 11

antal_kategorier er nu: 3
i er nu:(før vi kalder rekusivt) 0vi er nu i knuden: 12
SELECT * from Kategori WHERE parent = 12

antal_kategorier er nu: 3
i er nu:(før vi kalder rekusivt) 0vi er nu i knuden: 15
SELECT * from Kategori WHERE parent = 15

antal_kategorier er nu: 2
i er nu:(før vi kalder rekusivt) 0vi er nu i knuden: 18
SELECT * from Kategori WHERE parent = 18
slutnode

Vi er nu tilbage i et tidligere kald, knude 15

Vi er nu tilbage i et tidligere kald, knude 12

antal_kategorier er nu: 3
i er nu:(før vi kalder rekusivt) 1vi er nu i knuden: 16
SELECT * from Kategori WHERE parent = 16
slutnode

Vi er nu tilbage i et tidligere kald, knude 12

Vi er nu tilbage i et tidligere kald, knude 11

antal_kategorier er nu: 3
i er nu:(før vi kalder rekusivt) 1vi er nu i knuden: 13
SELECT * from Kategori WHERE parent = 13

Vi er nu tilbage i et tidligere kald, knude 11
Avatar billede spurn Nybegynder
19. september 2002 - 12:16 #11
Den fejl fandt jEg selv, ups. Opret et svar og du får point, jeg ved ikke helt hvordan jeg skal udtrykke hvor glad jeg egentligt er. Har bøvlet med det krat i meget meget lang tid.

MANGE TAK FOR HJÆLPEN !!!
Avatar billede kichian Nybegynder
19. september 2002 - 12:39 #12
Et svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester