I need to prune a binary tree past a certain level, l and need to return the number of pruned nodes.
Here's what I got:
#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);
This is the output of what I should have got and what I got:
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
Interestingly, if I create something like int r = 0; and do r++; every time the if(l == 0) statement is true, and then do a print statement, it prints r 4 times.
If I added 4 to the final count I would get the correct answer. I assume that I should then add to count the number of times the if(l == 0) is true.
(I can't do it. If I do count++ I get segmentation fault)
How would you do it? Thanks.
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;
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.