Я пытаюсь создать идеально сбалансированное дерево AVL из вектора элементов. Я начал с небольшого количества элементов (8), чтобы проверить правильность алгоритма. Моя проблема возникает при печати значений из ДЕРЕВА, я продолжаю получать следующее исключение
"Exception thrown: read access violation. nod->stanga was 0x4."
когда я добираюсь до (root)->(right)->left-:value, даже если я проверяю, является ли указатель нулевым, прежде чем что-либо печатать. структура:
typedef struct node
{ int key;
int size;
node *stanga;
node *dreapta;
}TreeNode;
массив: int vector[8] = {1, 2, 3, 4, 5, 6, 7, 8}; функция печати:
void printElements(TreeNode *nod)
{
if (nod != NULL)
{
printf("Nodul este : %d \n", nod->key);
if (nod->dreapta != NULL && nod->stanga != NULL)
{
printf("Nodul dreapta al nodului %d este : %d \n", nod->key, nod->dreapta->key);
printf("Nodul stamga al nodului este %d : %d\n ", nod->key, nod->stanga->key);
}
if (nod->dreapta != NULL)
{
printf("ramura dreapta a nodului %d cu valoare dreapta este : %d\n", nod->key,nod->dreapta->key);
printElements(nod->dreapta);
}
if (nod->stanga != NULL)
{
printf("ramura dreapta a nodului %d cu valoare stanga este : %d \n ",nod->key, nod->stanga->key);
printElements(nod->stanga);
}
}
else
{
printf("the end of the tree");
}
}
вызывается с:
TreeNode *nod = (TreeNode*)malloc(sizeof(TreeNode));
nod=Build_tree(0, 7);
printElements(nod);
build tree - это моя строительная функция:
TreeNode* Build_tree(int start, int end)
{
if (start < end)
{
int medium = (start + end) / 2;
TreeNode *n1 = (TreeNode*)malloc(sizeof(TreeNode));
n1->key = vector[medium];
n1->size = 1;
if (n1->stanga == NULL)
{
n1->size = n1->dreapta->size + 1;//alocam sizeul nodului din drepata
}
if (n1->dreapta == NULL)
{
n1->size = n1->stanga->size + 1;//altefl alocam sizeul nodului din stanga
}
n1->stanga = Build_tree(start, medium-1);
n1->dreapta = Build_tree(medium+1,end);
return n1;
}
}
Я немного заржавел в использовании указателей и сбалансированных деревьев. Может ли кто-нибудь помочь мне с подсказкой?
Build_tree
не всегда возвращает значение. Если вы разместили вопрос, не заметив этого, возможно, есть и другие ошибки, которые вы также упустили из виду. Скомпилируйте со всеми включенными предупреждениями. - person Weather Vane   schedule 25.04.2018if (start < end)
ложно. Если вы последуете моему совету и включите все предупреждения компилятора. . . Пожалуйста, сделайте это прямо сейчас. - person Weather Vane   schedule 25.04.2018Build_tree
. При выполнении блока кодаif (start < end)
функция возвращаетn1
. Если этот блок кода не выполняется, что возвращает функция? Посмотрите очень внимательно, это не имеет ничего общего с какой-либо постановкой задачи, а имеет отношение к путям управления. - person Weather Vane   schedule 25.04.2018