2014-10-03 2 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 

Большая проблема в том, что это происходит из теста, и я обязан использовать этот «код» и заполнить пробелы.

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

+0

Вот что меня смутило @HuStmpHrrr !! Потому что это вопрос теста, и я ** должен использовать скелет, который я предоставляю в последнем фрагменте кода, который у меня есть в моем вопросе. – gsamaras

+0

Я не знаю, что этот код пытается сделать. 'ap' и' bp' не являются симметричными. о идеальной проблеме дерева. почему вы не добавляете больше условий? 'b value && p-> value HuStmpHrrr

ответ

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

Спасибо за попытку! Однако это не сработает. Возьмем в качестве примера дерево, которое у меня есть в моем вопросе, и замените узел 8 на 3. Предоставляемая вами функция будет оценивать это дерево как неупорядоченное, а оно упорядочено. :/ – gsamaras

+0

@ G.Samaras oh, я перевернул значки сравнения. теперь он должен работать. – HuStmpHrrr

+0

Я показываю знаки, и я подозревал, что, но я тоже хотел проверить ответ. Я не только принимаю это, но я собираюсь продвинуть все, что я нахожу в вашем профиле! СПАСИБО! – gsamaras

Смежные вопросы