在解决树处理问题的同时,我对于存储已观察到某种模式的实例数的最佳方法感到困惑。
例如,假设我想返回二进制搜索树中的数字的次数可被2整除。我将递归地遍历树,检查每个键是否可以被2整除,并递增计数器。
现在,我可以考虑存储此计数器的唯一方法是参考。 例如:
DivByTwo(node, counter) {
DivByTwo(node.left, counter)
DivByTwo(node.right, counter)
if (node.key % 2 == 0)
counter ++
}
完成此操作后,计数器的值将是可被2整除的键数。这是解决此问题的正确方法吗?有没有更好的方法来捕获这些数据而不强迫用户通过引用传递一些变量?
答案 0 :(得分:5)
这是一种避免传递ref参数的方法,虽然它需要能够返回一个值(你不包含任何类型信息,所以我对你的类型做了最好的猜测):
int DivByTwo(NodeType node){
int result = DivByTwo(node.left) + DivByTwo(node.right);
if(node.key % 2 == 0)
result += 1;
return result;
}
答案 1 :(得分:0)
通过参考传递计数器是一种合理的“小”解决方案。如果您想要一个更正式,更复杂但更适应未来需求的解决方案,请考虑实施网络上许多地方描述的访客模式,包括in Wikipedia
答案 2 :(得分:0)
你可以通过返回结果来做到这一点:
int DivByTwo(Node *node) {
if (node == null_ptr)
return 0;
return DivByTwo(node->left) + DivByTwo(node->right) + (node->key%2==0);
}