Итак, что я хочу сделать, это проверить, является ли 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;
}
Не могли бы вы добавить код для определения своей структуры и где ваши переменные объявлены и инициализированы? – Mike