簡體   English   中英

將InOrder二進制搜索樹數據遞歸放入C中的數組

[英]Recursively put InOrder Binary Search Tree data into an array in C

我試圖將存儲在我的二進制搜索樹的每個節點中的數據遞歸插入到數組中,並通過代碼的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-> 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;

您可以在填充該索引后發送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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM