递归地将InOrder二进制搜索树数据放入C中的数组中

时间:2017-12-11 17:46:55

标签: c binary-search-tree void-pointers inorder double-pointer

我试图以递归方式将存储在二进制搜索树的每个节点中的数据插入到数组中,并通过代码的InOrder逻辑进行排序。

这是我正在使用的两个功能的片段。 " bst_getordered"一个人的参数和类型不能改变,只能改变其内容。 " node_getordered"可以任何必要的方式改变。

void bst_getordered(bst* b, void* v)
{
    int i = 0;
    if (b == NULL || v == NULL) {
      return;
    }
    node_getordered(b->top, (char*) v, i);
}

int node_getordered(bstnode* node, char* v, int i)
{
   if (node == NULL) {
       return i;
   }
   node_getordered(node->left, v, i);
   v[i] = (char) node->data;
   i++;
   node_getordered(node->right, v, i);
   return i;
}

它应该将树中的所有数据存储到数组中。然而它没有做到这一点,我无法弄清楚为什么......我认为我应该使用双指针增加地址,但我无法弄清楚如何去做...我的语法知识是缺乏那个领域......

[编辑1] 这是我用来确保代码工作的测试程序的片段:

void test_getordered(void)
{
       int i, sc;
       char words1[WORDS][STRSIZE] = {"it", "is", "a", "truth", 
       "universally", "acknowledged", "that",  "a", "single", "man", "in", 
       "possession", "of", "a", "good", "fortune", "must", "be", "in", 
       "want", 
       "of", "a", "wife"};
       char words2[WORDS][STRSIZE];
       bst* b = bst_init(STRSIZE, mystrcmp, myprintstr);
       bst_insertarray(b, words1, WORDS);
       assert(bst_size(b)==18);
       bst_getordered(b, words2);
       printf("%lu %s\n", sizeof(words2), words2[0]);
       for(i=0; i<17; i++){
                 sc = strcmp(words2[i], words2[i+1]);
                 assert(sc<0);
       }
       bst_free(&b);
       assert(b==NULL);
}

[编辑2]这些是我的节点和树的结构。我怀疑我需要以某种方式通过tree-&gt; elsz递增计数器,以便正确遍历数组:

struct bstnode {
   void* data;
   struct bstnode* left;
   struct bstnode* right;
};
typedef struct bstnode bstnode;

struct bst {
   bstnode* top;
   /* Data element size, in bytes */
   int elsz;
};
typedef struct bst bst;

1 个答案:

答案 0 :(得分:0)

您可以发送i变量的地址,并在填充该索引后增加它的值。

void bst_getordered(bst* b, void* v)
{
    if (b == NULL || v == NULL) {
        return;
    }
    int i = 0;
    node_getordered(b->top, (char*) v, &i);
}

void node_getordered(bstnode* node, char* v, int* i)
{
    if (node == NULL) {
        return;
    }
    node_getordered(node->left, v, i);
    v[*i] = (char) node->data;
    (*i)++;
    node_getordered(node->right, v, i);
}