所以,我想要做的是检查一个完整的二叉树叶子中的int是否大于它的父亲的int,并使用它作为一个标准,它将它的父亲一直改变到根目录。问题是,当它必须与根比较和改变位置时,它会发生段错误;如果我在此之前停止循环,它的工作正常(我认为)。我错过了一些明显的东西吗?
typedef struct tnode *Treeptr;
typedef struct tnode {
float owed;
long afm;
Treeptr father;
Treeptr left;
Treeptr right;
} Treenode;
添加新叶时会发生以下情况。我已经省略了叶子实际添加到树中的部分,因为它工作正常并且非常冗长。指针p指向循环开始之前插入的最后一个叶子。 root的父亲和叶子的子节点被初始化为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 :(得分:1)
在i=1
的情况下,p指向根节点,而p-&gt;父可以是野指针或未初始化的指针。
所以,当你执行行
if(p->owed > p->father->owed) {
p-&gt;父亲无法解除引用,并会显示分段错误。
我认为将行更改为
if( (p->father!=NULL) && (p->owed > p->father->owed) ) {
将解决它。