【发布时间】:2021-07-21 19:55:10
【问题描述】:
我是 stackoverflow 的新手,因此请随时根据需要更改或编辑我的问题。
我正在尝试修复以下代码,它本质上只是一个中序树遍历:
void *inorder_traversal(void *heapstart, uint32_t size, void *address) {
struct node *head = (struct node* )heapstart;
if (head->left_child == NULL) {
if (condition1) {
if (condition2) {
address = head->address;
}
}
} else {
inorder_traversal(head->left_child, size, address);
inorder_traversal(head->right_child, size, address);
}
return address;
}
我目前正在尝试返回一个void *,该void * 存储在我正在经历的一个节点中。该节点必须满足条件1(size < pow(2, head->initial_size) && size > pow(2, (head->initial_size) - 1))和条件2head->current_state == free。为了便于阅读,我已从代码中删除了这些内容。
当我尝试提取地址并将其返回时,我的问题出现了。我有那个address = head->address。但是,因为每当递归发生时head 都会发生变化,所以head->address 总是指向满足我条件的最后一个节点head->address 而不是head->address。
基本上我在问是否有办法在满足条件时中断遍历并返回我存储的地址。
有人建议我没有返回正确的值,但我不确定这是什么意思。
如果有任何混淆,请告诉我。
【问题讨论】:
-
head->left_child == NULL检查的目的是什么? -
我只对叶节点感兴趣,我生成树的方式是我总是同时拥有
left_child和right_child,并且它们在初始化时将是NULL。因此,检查是否有left_child足以让我验证它的叶子节点。 -
那些递归潜水仍然返回一些东西,你知道的。也许您应该保留它,而不是仅仅将其设置为忽略它。我还看到在这个函数中传递
address是零点。您仅将它用作赋值目标,并且作为值参数,它最终毫无价值,因为一旦函数返回,收获就会丢失。 -
您是否正在寻找满足这些条件的第一个有序节点?
-
@WhozCraig 是的,我同意,没有理由传递地址,这只是我尝试过的旧解决方案遗留下来的东西。我试图让
void* address;在我的主目录中未初始化。然后将它传递给这个函数,而不是返回void*,而是返回void,在这个函数中初始化它之后,我会在我的main中访问它。