所以我有一个结构数组,我想把它变成一个二叉搜索树。这就是我的代码的样子。
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中对结构数组进行排序。请帮帮我。
答案 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);
}