2014-08-28 4 views
-1
int count(struct node *root,struct node *p,struct node *q) 
{ 
    if(!root) 
    return 0; 
    int matches=count(root->left,p,q)+count(root->right,p,q); 
    if(root->data==p->data||root->data==q->data) 
     return 1+matches; 
    else 
     return matches; 
} 
struct node *lca(struct node *root,struct node *p,struct node *q) 
{ 
    if(!root||!p||!q) 
    return 0; 
    int totalmatches=count(root->left,p,q); 
    if(totalmatches==1) 
     return root; 
    else if(totalmatches==2) 
     return lca(root->left,p,q); 
    else 
     return lca(root->right,p,q); 
} 
int main() 
{ 
    struct node *root  = newNode(20); 
    root->left    = newNode(8); 
    root->right    = newNode(22); 
    root->left->left   = newNode(4); 
    root->left->right  = newNode(12); 
    root->left->right->left = newNode(10); 
    root->left->right->right = newNode(14); 
    struct node *p=newNode(8); 
    struct node *q=newNode(14); 
    struct node *t = lca(root, p, q); 
    printf("LCA of %d and %d is %d \n", p->data, q->data, t->data); 
return 0; 

} 

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

enter image description here

+0

Можем ли мы увидеть функцию newNode? – Igor

+1

Вы пробовали отлаживать? –

+0

У вас есть тестовый файл, который многократно генерирует segfault, и вы не можете найти ошибку? –

ответ

0

Вы называете lca с нулевым указателем в этом случае.

lca(20) --> count(left) == 2, so go left 
lca(8) --> count(left) == 0, so go right 
lca(12) --> count(left) == 0, so go right 
lca(14) --> count(left) == 0, so go right 
lca(NULL) boom