2014-10-15 4 views
-1

Я пытаюсь написать код для нахождения расстояний между корнем и любым узлом в двоичном дереве. Если значение узла, которое я ищу, не находится в дереве, я добавлю его в дерево и напишу его глубину. Я попытался написать код, но как-то для root я получил правильный ответ (depth = 0), и для чего-либо еще получаю значение depth = 1. Я давно искал код, так что, может быть, вы, ребята, можете помочь. Очень признателен.Найти расстояние между корнем и любым узлом в двоичном дереве

#include <stdio.h> 
#include <stdlib.h> 

typedef struct b_tree t; 

struct b_tree { 
    int value; 
    struct b_tree * right; 
    struct b_tree * left; 
}; 


int add(t **root, t *bam, int pom) { 

    if ((*root) == NULL) { 
     *root = bam; 
     return pom; 
    } 
    else { 
     if((*root)->value == bam->value){ 
      return pom; 
     } 
     else if((*root)->value > bam->value) { 
      pom++; 
      add(&(*root)->left, bam, pom); 
     } 

     else if ((*root)->value < bam->value) { 
      pom++; 
      add(&(*root)->right, bam, pom); 
     } 




    } 

    return pom; 
} 



int main() { 
    t *akt, *root = NULL; 
    int x=1, pom=0, depth; 

    while (x!=0){ 

     scanf("%d", &x); 
     pom=0; 
     akt = (t *)malloc(sizeof(t)); 
     akt->left = akt->right = NULL; 
     akt->value = x; 
     depth = add(&root, akt, pom); 
     printf("%d\n", depth); 

    } 

    return 0; 
} 

При отладке код попадает в необычный цикл (??). если pom - это значение, представленное как моя глубина от корня до узла, что он делает, он получает правильный ответ (глубина узла равна 3, pom = 3), но когда я пытаюсь вернуть pom; по неизвестной причине (мне) pom понижен всегда до 1. Спасибо за вашу помощь!

ответ

0

Вы отбрасываете значения, возвращаемые рекурсивными вызовами, на add(). Измените вызовы на:

return add(&(*root)->left, bam, pom); 
... 
return add(&(*root)->right, bam, pom); 
Смежные вопросы