2017-06-10 95 views
1

所以我有一個結構數組,我想變成二叉搜索樹。這裏是我的代碼的樣子。將結構數組轉換爲二叉搜索樹

typedef struct Student{ 
    char name[25]; 
    char surname[25]; 
    char Id[8]; 
    double grade; 
}Student; 

struct TNode 
{ 
    struct TNode* data; 
    struct TNode* left; 
    struct TNode* right; 
}; 

struct TNode* newNode(struct TNode* data); 

/* A function that constructs Balanced Binary Search Tree from a sorted array    
*/ 
struct TNode* sortedArrayToBST(struct Student** students, int start, int end) 
{ 
    /* Base Case */ 
    if (start > end) 
     return NULL; 

    /* Get the middle element and make it root */ 
    int mid = (start + end)/2; 
    struct TNode *root = newNode(students[mid]); 

    /* Recursively construct the left subtree and make it 
     left child of root */ 
    root->left = sortedArrayToBST(students, start, mid-1); 

    /* Recursively construct the right subtree and make it 
     right child of root */ 
    root->right = sortedArrayToBST(students, mid+1, end); 

    return root; 
} 

/* Helper function that allocates a new node with the 
    given data and NULL left and right pointers. */ 
struct TNode* newNode(struct TNode * data) 
{ 
    struct TNode* node = (struct TNode*) 
        malloc(sizeof(struct TNode)); 
    node->data = data; 
    node->left = NULL; 
    node->right = NULL; 

    return node; 
} 

/* A utility function to print preorder traversal of BST */ 
void preOrder(struct TNode* node) 
{ 
    if (node == NULL) 
     return; 
    printf("%s %s %s %.2f ", node->data); 
    preOrder(node->left); 
    preOrder(node->right); 
} 

這裏是我如何調用我的主要功能。

struct TNode *root = sortedArrayToBST(&students, 0, n-1); 

由於某些原因,雖然結構數組在我的主函數內部工作正常,但這看起來沒有工作。在調用sortedArraytoBST函數之前,我總是在我的主內部對我的結構數組進行排序。請幫幫我。

+1

沒有你的編譯器給你*'上結構TNODE *根= newNode(學生[MID])*一些警告;'? –

+0

是的,但我不明白爲什麼。 –

回答

0

我不能確定這個答案是否爲完整因爲你的代碼不完整,所以我無法測試它。

不過,有一個 「明顯的」 錯誤:您聲明

struct TNode* newNode(struct TNode* data); 

但你

struct TNode *root = newNode(students[mid]); 

其中students[mid]struct Student *調用它。

指針到不同類型在C.我猜測兼容你想有一些「通用」 B樹。 C中有一個解決方案:通用指針是void *。你不能取消引用它,但你可以它隱式地從任何其他(數據)指針類型轉換它。

所以,你應該做的至少是改變你的struct

struct TNode 
{ 
    void *data; 
    struct TNode *left; 
    struct TNode *right; 
}; 

和你的函數原型:

struct TNode* newNode(void *data); 

preOrder功能,您嘗試printf()整體結構 - >這是不可能的,printf()每個轉換說明符只需要一個參數!所以改變它,例如這個(如果你知道data總是指向一個struct Student):

void preOrder(struct TNode* node) 
{ 
    if (node == NULL) 
     return; 
    struct Student *stud = node->data; 
    printf("%s %s %s %.2f ", stud->name, stud->surname, stud->id, stud->grade); 
    preOrder(node->left); 
    preOrder(node->right); 
} 
+0

謝謝!現在這可能是一個愚蠢的問題,但我仍然有問題printf(「%s%s%s%.2f」,node-> data);我想我知道它有什麼問題,但我如何訪問數組打印它,例如? –

+0

@NickGarlis查看我關於** this **錯誤的更新。 –

+0

謝謝,但現在我得到了分段錯誤。 –