我正在处理涉及使用二进制搜索树的程序,我正在尝试初始化BST。但我很难理解为什么我们使用两种结构,以及为什么我要求成员留在不是结构或联合的东西中#34;
#include <stdio.h>
#include <stdlib.h>
#define ADD_LENGTH 30
typedef struct treeType{
int listingId, price, propertySize;
int numOfBeds, yearBult;
char agent[20];
char address[ADD_LENGTH];
struct treeType *left;
struct treeType *right;
}bNode;
typedef struct treeFrame{
bNode *node;
}bTree;
void init(bTree **tree);
int main(void)
{
bTree *tree;
init(&tree);
return 0;
}
void init(bTree **tree){
tree = NULL;
tree->left = NULL;
tree->node->right = NULL;
}
答案 0 :(得分:1)
但是我很难理解为什么我们使用两种结构
您正在处理两个抽象 - 树和树的节点。使用两个struct
s是完全合理的,每个抽象都有一个。
您发布的struct
树bTree
只有一个成员,即根节点。您可以添加其他成员 - 树中的节点数,树中叶节点的最大深度等等。尽管可以计算这些,但将它们作为成员变量并更新可能会有用当您修改树以使其可用而无需支付遍历树的成本时,它们就可以了。
要记住的主要事情是树和树的节点是两个不同的抽象。 应使用两个不同的struct
进行定义。每个都可以根据应用程序的需要独立扩展/更新。
为什么我得到&#34;要求成员留在不是结构或工会的东西&#34;
函数init
中的代码有几个原因是错误的。
tree
。在函数tree
中bTree**
。它是指向bTree
的指针的指针。bTree
没有名为left
的成员。因此,您尝试使用tree->left = NULL;
的行为不正确。您需要的是:
void init(bTree **tree)
{
// Allocate memory for the tree.
*tree = malloc(sizeof(bTree));
// Make the root node NULL to indicate it is an empty tree.
(*tree)->node = NULL;
}