在C中构建BST(非递归/非迭代)

时间:2015-03-30 01:30:20

标签: c binary-search-tree

我正在尝试将节点添加到C中的BST并将其打印出来。这是一个非常简单直接的实现,我得到了内存泄漏。我被困在这几个小时,请帮我看看有什么不对。我的代码是:

struct bstnode {
int item;
struct bstnode *left;
struct bstnode *right;
};

void destroy_tree(struct bstnode *t) {
if (NULL == t) {return;}
destroy_tree(t->left);
destroy_tree(t->right);
free(t);
}
void inorder_print(struct bstnode *t) {
if (NULL == t) {return;}
inorder_print(t->left);
printf("  %d", t->item);
inorder_print(t->right);
}

 int main(void) {

 struct bstnode *myt = malloc(sizeof(struct bstnode));
 struct bstnode *l = myt->left ; 
 struct bstnode *r = myt->right;
 l->item = 20;
 l->left = NULL;
 l->right = NULL;
 r->item = 30;
 r->left = NULL;
 r->right = NULL;
 myt->item = 25;
 inorder_print(myt);
 printf("\n");
 destroy_tree(myt);}

我怀疑指针分配中有错误,请解释一下我犯了什么错误。

提前致谢!

1 个答案:

答案 0 :(得分:1)

指针初始化为一个未知值,无论在创建过程中该内存区域是什么,所以假设它们是“脏”的,偏执的程序员在工作之前“清理”它们,但如果你理解使用指针则没有必要。清理的一种方法是为结构创建一个构造函数,将其内部指针初始化为NULL。现在你知道它们是NULL。 c ++中的研究构造函数。

现在添加构造函数,(使用malloc,因此不会自动调用构造函数,手动调用它,可以将其更改为Init()函数以防止语义问题)。当malloc时,立即调用Init()。现在再次检查你的代码,它有什么问题?错误是否更明确?

你只在第一行构建myt bstnode,L然后变成myt-> left(null / undefined),R

也是如此

然后您访问L的内容,该内容为null,因此崩溃。