【发布时间】:2018-04-24 21:19:29
【问题描述】:
我正在尝试从元素向量创建 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;
数组: 整数向量[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);
构建树是我的构建功能:
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并不总是返回值。如果您在没有注意到这一点的情况下发布了问题,那么您可能还忽略了其他错误。编译时启用所有警告。 -
为什么它不总是返回一个值?在哪条路径上?(在调试时我只能查看根的值和根值的左/右,而不是进一步(如根->左->左))
-
当
if (start < end)为假时。如果您遵循我的建议并启用所有编译器警告。 . .请立即这样做。 -
在项目属性中使用 /w3#### 启用所有编译器警告?
-
请看函数
Build_tree。当if (start < end)代码块被执行时,函数返回n1。如果那个代码块没有被执行,函数返回什么?仔细看,跟任何问题陈述都没有关系,而是控制路径。
标签: c avl-tree tree-balancing