Мое дерево хранится в виде набора массивов, содержащих 4 указателя для каждого узла, я хочу напечатать все позиции указателей, которые не являются NULL
, например, это изображение:
(где N обозначает NULL
) должно вывести
012
013
223
231
Следует отметить, что каждый путь имеет одинаковую длину (в данном случае это 3, но в целом он намного больше) и что каждый лист представляет собой массив NULL
указателей.
До сих пор я придумал следующее, но на самом деле это не сработало, поэтому проигнорируйте его (массив узла называется base):
void print(node* s){
if (s==NULL) return;
else{
int b=0;
for (int j=0; j<4; j++){
if (s->base[j]!=NULL) {
b=1;
printf("%d", j);
print(s->base[j]);
}
}
if (b==0) printf("\n");
}
}
Вот и все:
#include <stdio.h>
#include <stdlib.h>
typedef struct tree{
struct tree* base[4];
} node;
int f(char r){
if (r=='A') return 0;
else if (r=='C') return 1;
else if (r=='G') return 2;
else if (r=='T') return 3;
else return -1;
}
char invf(int x){
if (x==0) return 'A';
else if (x==1) return 'C';
else if (x==2) return 'G';
else if (x==3) return 'T';
}
int ntree(node* s){
char r=getchar();
//putchar(r);
if (r=='\n') return 1;
int l=f(r);
if (l==-1)
return 0;
else{
if (s->base[l]!=NULL) return ntree(s->base[f(r)]);
else{
s->base[l]=malloc(sizeof(node));
for (int i=0; i<4; i++) s->base[l]->base[i]=NULL;
return ntree(s->base[f(r)]);
}
}
}
void print(node* s){
if (s==NULL) return;
else{
int b=0;
for (int j=0; j<4; j++){
if (s->base[j]!=NULL) {
b=1;
printf("%c", invf(j));
print(s->base[j]);
}
}
if (b==0) printf("\n");
}
}
int main(){
node* s=malloc(sizeof(node));
for (int j=0; j<4; j++) s->base[j]=NULL;
while (ntree(s)!=0) ntree(s);
print(s);
}