【问题标题】:Turn an array of structs into a binary search tree将结构数组转换为二叉搜索树
【发布时间】:2017-06-10 15:21:37
【问题描述】:

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

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

这是我在 main 中调用函数的方式。

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

尽管结构数组在我的 main 函数中可以正常工作,但由于某种原因,这似乎不起作用。在调用 sortedArraytoBST 函数之前,我总是在 main 中对结构数组进行排序。请帮帮我。

【问题讨论】:

  • 你的编译器没有在struct TNode *root = newNode(students[mid]);上给你一些警告吗?
  • 是的,但我不明白为什么。

标签: c arrays struct binary-search-tree


【解决方案1】:

我不能确定这个答案是否完整,因为你的代码不完整,所以我无法测试它。

仍然有一个“明显”的错误:你声明

struct TNode* newNode(struct TNode* data);

但你用它来称呼它

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

其中students[mid]struct Student *

指向不同类型的指针在 C 中兼容。我您想要的是一些“通用”B-Tree。 C 中有一个解决方案:generic 指针是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);
}

【讨论】:

  • 谢谢!现在这可能是一个愚蠢的问题,但我仍然有 printf("%s %s %s %.2f ", node->data); 的问题。我想我知道它有什么问题,但是我如何访问数组来打印它?
  • 谢谢,但现在我遇到了分段错误。
猜你喜欢
  • 1970-01-01
  • 2020-12-28
  • 2018-11-05
  • 2017-03-30
  • 1970-01-01
  • 1970-01-01
  • 2011-07-24
  • 1970-01-01
  • 2021-02-07
相关资源
最近更新 更多