2015-11-28 39 views
0

我目前正在執行二叉搜索樹,我想用這樣的功能來查找樹的最小值:發現在一棵樹上特定值

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是w的地址這裏應該存儲一個最小節點的副本(使用copyValue函數)(我不知道如何創建)。 Tr * T是第一個結構體的指針。函數smallest如果能夠找到最小值則返回1,否則返回0(樹爲空)。

我不確定我的實現是否找到最小的節點是正確的,因爲我的函數總是返回1,除非樹是空的?

回答

1

如果我理解正確,如果樹中存在最小值,則函數「最小」必須返回1,否則返回0。這聽起來不太有用,因爲只要樹不是空的,樹中總是會有最小的值。在這方面,你的功能是正確的。

然而,你的函數試圖在指針指向任何東西之前,在while循環中去引用指針n。所有的賭注都是關於實際發生的事情,這可能不是你想要的。 (我想編譯器正在優化它,因爲n從來沒有用過。)我認爲你要做的是找到最小的值,在這種情況下,你應該首先將樹的根節點地址分配給n。你可以做

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

這樣,在循環之後,n將指向具有最小值的節點。 希望這有助於:)