c - A certain level of a binary tree to array -


i need put inside array, values of binary tree, thing is, should put inside array values @ depth. , should output number of elements inserted @ array.

i have made this:

int nivel2_(abin a, int n, int v[], int level, int *i){     int t;     if(!a) return 0;      if(n == level){         v[(*i)++] = a->value;         return 1;     }else{         t = nivel2_(a->left, n, v, level+1, i) + nivel2_(a->right, n, v, level+1, i);     }      return t; }  int nivel2(abin a, int n, int v[]){     int k = 0;     int *i;     = &k;      return nivel2_(a, n, v, 1, i); } 

as keep changing index recursively , when reach depth want, thought of using pointer, way, when 1 part of recursive folding happens change value other folding processes. makes sense?

structures:

typedef struct slist {     int value;     struct slist* next; } *slist;  typedef struct arvbin* abin; typedef struct arvbin {     int value;     abin right;     abin left; } arvb; 

does work?

only when want elements of first level of depth!

calling this:

 nivel2(tree2, 1, v); 

complete code

#include <stdio.h> #include <stdlib.h>  typedef struct slist {     int value;     struct slist* next; } *slist;  typedef struct arvbin* abin; typedef struct arvbin {     int value;     abin right;     abin left; } arvb;   int nivel2_(abin a, int n, int v[], int level, int *i){     int t;     if(!a) return 0;      if(n == level){         v[(*i)++] = a->value;         return 1;     }else{         t = nivel2_(a->left, n, v, level+1, i) + nivel2_(a->right, n, v, level+1, i);     }      return t; }  int nivel2(abin a, int n, int v[]){     int k = 0;     int *i;     = &k;      return nivel2_(a, n, v, 1, i); }  void inserttree(abin *tree, int val){     if((*tree)==null){         *tree = (abin) malloc(sizeof(arvb));         (*tree)->value = val;         (*tree)->left = null;         (*tree)->right = null;         return;     }     else if(val > (*tree)->value)     {         inserttree(&((*tree)->right), val);     }     else if(val <= (*tree)->value)     {         inserttree(&((*tree)->left), val);     }     return; }  int main(){      int v[10] = {0};      abin tree2 = null;     inserttree(&tree2, 22);     inserttree(&tree2, 1);     inserttree(&tree2, 3);      nivel2(tree2, 1, v);      int i;         for(i=0; i<5; i++){         printf("%d\n", v[i]);     }      return 0;  } 

the code looks ok me. here's mildly modified version, tree printing function added, , diagnostics, , extended tree. suspicion expected tree have 2 levels, had 3.

code

#include <stdio.h> #include <stdlib.h>  typedef struct slist {     int value;     struct slist* next; } *slist;  typedef struct arvbin* abin; typedef struct arvbin {     int value;     abin right;     abin left; } arvb;  static int nivel2_(abin a, int n, int v[], int level, int *i) {     int t = 0;     if (a)     {         if (n == level)         {             v[(*i)++] = a->value;             t = 1;         }         else         {             t += nivel2_(a->left, n, v, level + 1, i);             t += nivel2_(a->right, n, v, level + 1, i);         }     }      return t; }  static int nivel2(abin a, int n, int v[]) {     int k = 0;     int r = nivel2_(a, n, v, 1, &k);     printf("r = %d; k = %d\n", r, k);     return k; }  static void inserttree(abin *tree, int val) {     if ((*tree) == null)     {         *tree = (abin) malloc(sizeof(arvb));         (*tree)->value = val;         (*tree)->left = null;         (*tree)->right = null;         return;     }     else if (val > (*tree)->value)     {         inserttree(&((*tree)->right), val);     }     else if (val <= (*tree)->value)     {         inserttree(&((*tree)->left), val);     } }  static void tree_to_array(abin tree, int level) {     int v[10] = { 0 };     int n = nivel2(tree, level, v);     printf("converted level %d array:", level);     (int = 0; < n; i++)         printf(" %d", v[i]);     putchar('\n'); }  static void print_tree(abin tree, int level) {     if (tree != 0)     {         printf("level %d: %d\n", level, tree->value);         print_tree(tree->left, level + 1);         print_tree(tree->right, level + 1);     } }  int main(void) {     abin tree2 = null;     inserttree(&tree2, 22);     inserttree(&tree2, 10);     inserttree(&tree2, 13);     inserttree(&tree2, 33);     inserttree(&tree2, 39);     inserttree(&tree2, 43);     inserttree(&tree2, 19);      print_tree(tree2, 1);      (int level = 1; level < 5; level++)         tree_to_array(tree2, level);      return 0; } 

sample output

level 1: 22 level 2: 10 level 3: 13 level 4: 19 level 2: 33 level 3: 39 level 4: 43 r = 1; k = 1 converted level 1 array: 22 r = 2; k = 2 converted level 2 array: 10 33 r = 2; k = 2 converted level 3 array: 13 39 r = 2; k = 2 converted level 4 array: 19 43 

that looks correct me tree shape that's printed.


Comments

Popular posts from this blog

toolbar - How to add link to user registration inside toobar in admin joomla 3 custom component -

linux - disk space limitation when creating war file -

How to provide Authorization & Authentication using Asp.net, C#? -