Я делаю проект для школы, и у меня странная ошибка. Я использую Complete Binary Tree, и у меня возникают проблемы с заменой узла на его родителя.
Во время тестирования я обнаружил, что 1 случай не работает должным образом.
Это:
Все остальные операции подкачки работают нормально, кроме этого случая
Структура моего дерева такова
typedef struct TreeNode {
void * data;
struct TreeNode * left;
struct TreeNode * right;
struct TreeNode * parent;
} TNode;
typedef struct CompleteBinaryTree {
TNode * root;
TNode * last;
int numelm;
} CBTree;
CBTree * newCBTree(void)
{
CBTree * ret = malloc(sizeof(CBTree));
if( ret )
{
ret->root = NULL;
ret->last = NULL;
ret->numelm = 0;
}
}
TNode * newTNode( void * data )
{
TNode *ret = malloc(sizeof(TNode));
if( ret )
{
ret->data = data;
ret->parent = ret->left = ret->right = NULL;
}
return ret;
}
Это мой функция обмена:
void CBTreeSwap(CBTree* tree, TNode* parent, TNode* child)
{
assert(parent != NULL && child != NULL && (child == parent->left || child == parent->right));
if (child == tree->last)
tree->last = parent;
if(child == parent->left)
{
if(child->left != NULL)
child->left->parent = parent;
parent->left = child->left;
child->left = parent;
if (child->right != NULL)
child->right->parent = parent;
if (parent->right != NULL)
parent->right->parent = child;
TNode * tmp = child->right;
child->right = parent->right;
parent->right = tmp;
if (parent != tree->root)
{
parent->parent->left = child;
child->parent = parent->parent;
parent->parent = child;
}
else
{
child->parent = NULL;
tree->root = child;
parent->parent = child;
}
}
else
{
if(child->right != NULL)
child->right->parent = parent;
parent->right = child->right;
child->right = parent;
if(child->left != NULL)
child->left->parent = parent;
if(parent->left != NULL)
parent->left->parent = child;
TNode * tmp = child->left;
child->left = parent->left;
parent->left = tmp;
if(parent != tree->root)
{
parent->parent->right = child;
child->parent = parent->parent;
parent->parent = child;
}
else
{
child->parent = NULL;
tree->root = child;
parent->parent = child;
}
}
}
Для вставки в используемое дерево используется следующее:
void CBTreeInsert(CBTree* tree, void* data)
{
TNode * tmp = newTNode(data);
TNode * curr = tree->last;
if(tree->root == NULL)
{ //empty
tree->root = tmp;
}
else if(tree->last == tree->root)
{ //one node
tree->last->left = tmp;
tmp->parent = tree->root;
}
else if(tree->last->parent->right == NULL)
{ //general
tree->last->parent->right = tmp;
tmp->parent = tree->last->parent;
}
else if (tree->last == tree->last->parent->right)
{ //degenarated
curr = tree->last->parent ;
while (1)
{
if (curr == tree->root)
break ;
if (curr == curr->parent->left)
{
curr = curr->parent->right ;
assert(curr != NULL) ;
break ;
}
curr = curr->parent ;
}
while (curr->left != NULL)
{
assert(curr->right != NULL) ;
curr = curr->left ;
}
assert(curr->right == NULL) ;
tmp->parent = curr ;
curr->left = tree->last = tmp;
}
else
{
fprintf(stderr,"Error\n");
}
tree->last = tmp;
tree->numelm++;
}
Поэтому я строю свой тест следующим образом:
void main(){
int * i[15], j;
CBTree * tree = newCBTree(); //create tree
for(j=0; j<15; j++)
{
i[j] = malloc(sizeof(int));
*(i[j]) = j+1;
CBTreeInsert(tree, (int*) i[j]);
}
//All these work
CBTreeSwap(T, T->root->left, T->root->left->left);
CBTreeSwap(T, T->root, T->root->left);
CBTreeSwap(T, T->root->right, T->root->right->right);
CBTreeSwap(T, T->root, T->root->right);
CBTreeSwap(T, T->last->parent, T->last);
//This one is broken
CBTreeSwap(T, T->root->left, T->root->left->right);
}
Когда я запускаю этот тест и попытка просмотреть мое дерево. Я получаю все ветви моего дерева, за которыми следует ошибка сегмента.
Это всего лишь часть большого проекта, если вам нужно больше моего кода, не стесняйтесь спроси
Спасибо!