在树中查找特定值

时间:2015-11-28 23:05:31

标签: c binary-search-tree

我正在实现二进制搜索树,我正在尝试使用这样的函数找到树中的最小值:

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,除非树是空的?

1 个答案:

答案 0 :(得分:1)

如果我理解正确,如果树中存在最小值,则函数“smallest”必须返回1,否则返回0。这听起来不是很有用,因为只要树不是空的,树中总会有一个最小的值。在这方面,你的功能是正确的。

但是,在while循环中,函数尝试在将指针n分配给任何内容之前取消引用它。关于实际发生的事情,所有的赌注都是关闭的,这可能不是你想要的。 (我想编译器正在优化它,因为从未使用过n。)我认为你要做的是找到最小的值,在这种情况下,你应该首先将树的根节点的地址分配给n。你可以做到

...
n = T->root;
while(n->left != NULL) {
    n = n->left;
}

这样,在循环之后,n将指向具有最小值的节点。 希望这会有所帮助:)