将结构数组转换为二叉搜索树

时间:2017-06-10 15:21:37

标签: c arrays struct binary-search-tree

所以我有一个结构数组,我想把它变成一个二叉搜索树。这就是我的代码的样子。

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); 

虽然结构数组在我的main函数中正常工作,但由于某种原因,它似乎没有工作。在调用sortedArraytoBST函数之前,我总是在main中对结构数组进行排序。请帮帮我。

1 个答案:

答案 0 :(得分:0)

我无法确定此答案是否完整因为您的代码尚未完成,所以我无法对其进行测试。

然而,有一个"显而易见的"错误:您声明

struct TNode* newNode(struct TNode* data);

但你用

来称呼它
struct TNode *root = newNode(students[mid]);

其中students[mid]struct Student *

指向不同类型的指针在C中兼容。我猜测您想拥有的是" 通用&# 34; 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);
}