2014-11-26 1 views
-1

Я работаю с тройным деревом поиска. Следующий код должен дать вам обзор того, как выглядит дерево. Каждый лист будет содержать указатель на связанный список, содержащий указатель на головной узел. Каждый лист может иметь не более 3 узлов. Поэтому после того, как корневой лист был заполнен тремя значениями данных, следующее значение, если оно меньше первого узла, будет вставлено слева, если оно больше, оно будет вставлено вправо, и если оно посередине, оно будет вставьте в центр ребенка.Функция поиска для дерева

struct data 
{ 
    int val; 
}; 


struct node 
{ 
    struct node* next; 
    struct data* dta; 
}; 

struct linkedList 
{ 
    int size; 
    struct node *head; 
}; 

struct leaf 
{ 
    struct linkedList* ll; 
    struct leaf* left; 
    struct leaf* right; 
    struct leaf* center; 
    struct leaf* parent; 
}; 

struct tree 
{ 
    struct leaf* root; 
}; 

В настоящее время я пытаюсь создать функцию, которая принимает в качестве входных данных дерево и значение int. Затем он проверяет каждый лист в дереве, чтобы убедиться, что какой-либо лист равен значению int, и если он это сделает, он возвращает 1 и 0 в противном случае.

Ниже мой код

int totalLeaf(struct leaf *lf) 
{ 
    int sum = 0; 
    struct node *temp = lf->ll->head; 
    while(temp!=NULL) 
    { 
    sum = sum + temp->dta->val; 
    temp = temp->next; 
    } 
    printf("sum is : %d\n",sum); 
    return sum; 
} 

int searchTotal(struct tree *tr,int total) 
{ 
    if(tr->root == NULL) 
    { 
    return 0; 
    } 
    else 
    { 
    return searchTotal_r(tr->root,total); 
    } 
} 

int searchTotal_r(struct leaf *lf,int total) 
{ 
    if(lf==NULL) 
    { 
    return 0; 
    } 
    if(totalLeaf(lf) == total) 
    { 
    return 1; 
    } 
    else 
    { 
    searchTotal_r(lf->left,total); 
    searchTotal_r(lf->center,total); 
    searchTotal_r(lf->right,total); 
    } 

    return 0; 
} 

Можно ли предположить, где я пошло не так, и как я могу решить эту проблему?

ответ

1
else 
    { 
    searchTotal_r(lf->left,total); 
    searchTotal_r(lf->center,total); 
    searchTotal_r(lf->right,total); 
    } 

Изменить на:

else 
    { 
    return searchTotal_r(lf->left,total) || 
      searchTotal_r(lf->center,total) || 
      searchTotal_r(lf->right,total); 
    } 

так, как вы в настоящее время есть, рекурсивные запросы на самом деле не важно, потому что вы всегда возвращает 0, даже если вы найдете что-то.

+0

Вы правы, глупый я. Также интересовался временной сложностью в этом, мы в значительной степени делаем исчерпывающий поиск, я имею в виду, что мы в основном проверяем все возможности? O (N) – user1010101

+1

Да, вы делаете исчерпывающий поиск дерева, так что O (N). Я думаю, что обычно дерево будет сортироваться таким образом, что left/center/right на самом деле означает что-то, но в вашем случае дерево выглядит несортированным. – JS1