2016-05-21 12 views
0

Ich muss einen Binärbaum über eine bestimmte Ebene l zurückschneiden und muss die Anzahl der beschnittenen Knoten zurückgeben.C - Binärbaum: kann die korrekte Anzahl der beschnittenen Knoten nicht zurückgeben

Hier ist, was ich habe:

#include "abin.h" 

int freeAB (ABin a) { 
    int count = 0; 
    if(a == NULL) return count; 
    count = count + freeAB(a->esq); 
    count = count + freeAB(a->dir); 
    free(a); 
    count++; 
    return count; 
} 


int pruneAB (ABin *a, int l) { 

    int count = 0; 
    if(l == 0){ 
     count = count + freeAB((*a)->esq); 
     count = count + freeAB((*a)->dir); 
     (*a) = NULL; 
    } 
    else{ 
     count = count + pruneAB(&((*a)->esq), l-1); 
     count = count + pruneAB(&((*a)->dir), l-1); 
    } 
    return count; 
} 

ABIN.H:

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

typedef struct lligada { 
    int valor; 
    struct lligada *prox; 
} *LInt; 

typedef struct nodo { 
    int valor; 
    struct nodo *esq, *dir; 
} *ABin; 

int pruneAB (ABin *a, int l);  

Dies ist die Ausgabe von dem, was ich habe sein sollte und was ich habe:

Input: (depth=2) 
       8 
     4    12 
    2  6  10  14 
1 3 5 7 9 11 13 15 

Output: 
[expected] res=12 
    8 
4 12 

[obtained] res=8 
    8 
4 12 

0/10 correct answers 

Interessanterweise, wenn Ich erschaffe etwas wie int r = 0; und mach r ++; Jedes Mal, wenn die Anweisung if (l == 0) wahr ist und dann eine print-Anweisung ausführt, gibt es r 4 mal aus.

Wenn ich 4 zur endgültigen Zählung addierte, würde ich die richtige Antwort bekommen. Ich nehme an, dass ich dann addieren sollte, um zu zählen, wie oft if (l == 0) wahr ist.

(Ich kann es nicht tun. Wenn ich zählen kann ++ ich Segmentierungsfehler erhalten)

Wie würden Sie es tun? Vielen Dank.

https://codeboard.io/projects/16275

+1

Ich schlage vor, Sie 'gdb' zu sehen, wo die' Segmentierung fault' –

+2

tritt auf, wenn Sie einen Absturz zu bekommen (was was ist ein Segmentierungsfehler), dann sollten Sie ein Debug-Build ausführen in einem Debugger. Wenn es in einem Debugger ausgeführt wird, stürzt es "in Aktion" ab und stoppt die Ausführung an der Stelle des Absturzes. Nach dem Stoppen können Sie Werte von Variablen untersuchen, den Funktionsaufruf-Stack untersuchen und sogar den Funktionsaufruf-Stack aufrufen, den Sie ausführen sollten, wenn der Debugger in Code stoppt, der nicht Ihnen gehört. –

+3

Wenn Sie jedoch * keinen * Absturz bekommen, können Sie trotzdem einen Debugger verwenden. Mit einem Debugger, insbesondere in einer IDE, können Sie Ihren Code Zeile für Zeile durchgehen und in Ihre Funktionen einsteigen, um zu sehen, was * wirklich * passiert. Sie können auch Ihre Variablen überwachen und sehen, wie sie Werte ändern. –

Antwort

1
int pruneAB (ABin *a, int l) { 
    int count = 0; 
    if (!*a) return 0; 
    if (l < 0) return count; 
    if(l == 0){ 
     count = freeAB(*a); 
     (*a) = NULL; 
    } 
    else{ 
     count = count + pruneAB(&((*a)->esq), l-1); 
     count = count + pruneAB(&((*a)->dir), l-1); 
    } 
    return count; 
} 
+0

zu kompilieren und zu debuggen Hey, ich denke, Ihre Lösung fehlt das Um einen Segmentierungsfehler zu vermeiden: 'if (! * a) return 0; sonst sieht es so aus, als ob es funktioniert, mein Fehler war, dass ich nicht wirklich eine Ebene von meinem binären Baum löschte, obwohl es schien, dass ich es tat. Bearbeiten Sie es so, dass es korrekt ist, damit ich es als beste Antwort markieren kann :) Danke. –