2014-10-03 41 views
0

我有這些函數來確定二叉樹是否被排序。確定樹是否有序的函數(即BST)

(假設我們已經實施了treemanagement.c,我已經修改爲主機整數,而不是字符串)

int ordtree(Treeptr p) { 
    int a, b; 
    return (p == NULL || fun(p, &a, &b)); 
} 

int fun(Treeptr p, int * ap, int * bp) { 
    int a, b; 
    // Is 'p' a leaf? 
    if (p->left == NULL && p->right == NULL) { 
    *ap = p->value; 
    return 1; 
    } 

    // Does 'p' have only a left child? 
    if (p->right == NULL) { 
    *bp = p->value; 
    return (fun(p->left, &b, ap) && p->value > b); 
    } 

    // Does 'p' have only a right child? 
    if (p->left == NULL) { 
    *ap = p->value; 
    return (fun(p->right, &a, bp) && p->value < a); 
    } 

    // 'p' has two children 
    return (fun(p->right, &a, bp) && fun(p->left, &b, ap)); 
} 

的問題是,這不是一個完美的樹工作(所有節點兩個孩子,因爲在我的代碼中沒有完美的樹的情況下檢查值!)。

例如,這個無序樹將被評估爲有序樹!

 4 
    2  6 
1 8 5 7 

更大的問題是,這是來自一個測試,我有義務使用這個「代碼」並填寫GAPs。

int fun(Treeptr p, .....GAP A.....) 
{ 
    int a, b; 
    if (p->left == NULL && .....GAP B.....) { 
    *ap = p->value; 
    .....GAP C..... 
    } 
    if (p->right == NULL) { 
    *bp = p->value; 
    return (fun(.....GAP D.....) && p->value > b); 
    } 
    if (.....GAP E.....) { 
    .....GAP F..... 
    return (fun(p->right, &a, bp) && GAP .....G.....); 
    } 
    return (.....GAP H.....); 
} 

任何指導?

+0

爲什麼你需要這麼多參數?只要比較按鍵就足夠了。 – HuStmpHrrr 2014-10-03 19:26:32

+0

這就是我困惑的@HuStmpHrrr!因爲這是一個測試問題,我必須**使用我在我的問題的最後一段代碼中提供的框架。 – gsamaras 2014-10-03 19:28:01

+0

我不知道代碼試圖做什麼。 'ap'和'bp'不是對稱的。關於完美的樹問題。爲什麼你不添加更多的條件? 'b 值&& p->值 HuStmpHrrr 2014-10-03 19:48:21

回答

1

這是我能做的最好的代碼。

int fun(Treeptr p, int * ap, int * bp) { 
    int a, b; 
    // Is 'p' a leaf? 
    if (p->left == NULL && p->right == NULL) { 
    *ap = p->value; 
    *bp = p->value; return 1; //gap c 
    } 

    // Does 'p' have only a left child? 
    if (p->right == NULL) { 
    *bp = p->value; 
    return (fun(p->left, ap, &b) && p->value > b); //gap d 
    } 

    // Does 'p' have only a right child? 
    if (p->left == NULL) { 
    *ap = p->value; 
    return (fun(p->right, &a, bp) && p->value < a); // gap g 
    } 

    // 'p' has two children 
    return (fun(p->right, &a, bp) && fun(p->left, ap, &b) && a > p->value && p->value > b); // gap h 
} 
+0

感謝您的嘗試!但是,這不起作用。以我在我的問題中的樹爲例,並用3替換節點8.您提供的函數將在訂購時評估此樹爲無序。 :/ – gsamaras 2014-10-03 20:08:51

+0

@ G.Samaras哦,我扭轉了比較的跡象。現在它應該工作。 – HuStmpHrrr 2014-10-03 20:13:59

+0

我顯示了跡象,我懷疑這一點,但我也想測試答案。我不僅接受了這一點,而且我還會在我的個人資料中發現其他任何我覺得很好的東西!謝謝! – gsamaras 2014-10-03 20:17:56