2014-01-03 2 views
1

Итак, что я хочу сделать, это проверить, является ли int внутри полного дерева двоичных деревьев больше, чем у его отца, и используя это как критерий, он меняет места со своим отцом непрерывно вплоть до корня. Дело в том, что он segfaults, когда он должен сравнивать и менять места с корнем; если я сделаю остановку цикла до этого, она работает нормально (я думаю). Я пропустил что-то очевидное здесь?Изменение родительского и дочернего мест в двоичном дереве

typedef struct tnode *Treeptr; 

typedef struct tnode { 
    float owed; 
    long afm; 

    Treeptr father; 
    Treeptr left; 
    Treeptr right; 
} Treenode; 

При добавлении нового листа происходит следующее: Я пропустил ту часть, где лист фактически добавлен к дереву, потому что он отлично работает и довольно длинный. Указатель p указывает на последний лист, вставленный до начала цикла. Отец корня и дети листьев инициализируются как NULL.

static int depth = 1;  
static int nodes_number = 0;   
int i; 
Treeptr temp, temp2; 

if(nodes_number == pow(2, depth) - 1) 
    depth++;    
nodes_number++; 

for(i=1 ; i<depth ; i++) {  
    if(p->owed > p->father->owed) { 
     temp = p->father; 
     p->father = temp->father; 
     if(temp->father != NULL) { 
      if(temp == temp->father->left) 
       temp->father->left = p; 
      else 
       temp->father->right = p; 
     } 
     if(p == temp->left) { 
      temp->left = p->left; 
      p->left = temp; 
      temp2 = p->right; 
      p->right = temp->right; 
      temp->right = temp2;     
     } 
     else { 
      temp->right = p->right; 
      p->right = temp; 
      temp2 = p->left; 
      p->left = temp->left; 
      temp->left = temp2; 
     }   
    } 
    else 
     break; 
} 
+0

Не могли бы вы добавить код для определения своей структуры и где ваши переменные объявлены и инициализированы? – Mike

ответ

1

В случае, когда i=1, р указывает на корневой узел и p-> отец может быть дикий указатель или неинициализированная указатель. Таким образом, при выполнении строки

if(p->owed > p->father->owed) { 

p-> отец не может быть разыменованной и покажут ошибку сегментации.

Я думаю, изменив строку на

if((p->father!=NULL) && (p->owed > p->father->owed)) { 

будет решить.

+0

Хммм, как будто он не показывает segfault, но он все еще не работает совершенно правильно. Трудно объяснить, похоже, что дерево сжимается до двух узлов, нового корня и предыдущего корня. – Giannaras

+0

укажите начальное значение 'p'. – skrtbhtngr

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