我正在实现二进制搜索树,我正在尝试使用这样的函数找到树中的最小值:
int smallest(Tr *T, void *Item) {
TNode * n;
if(Size(T) == 0)
return 0;
while(n->left != NULL) {
n = n->left;
}
return 1;
}
我有结构:
typedef struct TNodeTag {
void *v;
struct TNodeTag*left, *right, *parent;
} TNode;
typedef struct {
TNode *root;
TNode *current;
void * (*copyItems) (void *, void *);
int value;
} Tr;
首先是初始化函数:
void Initialize (Tr *T,void * (*copyItems) (void *, void *),{
T->root = NULL;
T->copyItems = copyItems;
T->value = 0;
}
其中void * Item
是应该存储最小节点副本的地址(使用copyValue函数)(我不知道如何创建)。 Tr * T
是指向第一个结构的指针。函数smallest
如果可以找到最小值则返回1,否则返回0(树为空)。
我不确定我找到最小节点的实现是否正确,因为我的函数将始终返回1,除非树是空的?
答案 0 :(得分:1)
如果我理解正确,如果树中存在最小值,则函数“smallest”必须返回1,否则返回0。这听起来不是很有用,因为只要树不是空的,树中总会有一个最小的值。在这方面,你的功能是正确的。
但是,在while循环中,函数尝试在将指针n分配给任何内容之前取消引用它。关于实际发生的事情,所有的赌注都是关闭的,这可能不是你想要的。 (我想编译器正在优化它,因为从未使用过n。)我认为你要做的是找到最小的值,在这种情况下,你应该首先将树的根节点的地址分配给n。你可以做到
...
n = T->root;
while(n->left != NULL) {
n = n->left;
}
这样,在循环之后,n将指向具有最小值的节点。 希望这会有所帮助:)