Печать всех корневых путей в четырехветвленном дереве - PullRequest
0 голосов
/ 25 сентября 2019

Мое дерево хранится в виде набора массивов, содержащих 4 указателя для каждого узла, я хочу напечатать все позиции указателей, которые не являются NULL, например, это изображение: enter image description here(где 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...