【发布时间】:2011-01-27 13:55:29
【问题描述】:
假设以下函数:
int binaryTree::findHeight(node *n) {
if (n == NULL) {
return 0;
} else {
return 1 + max(findHeight(n->left), findHeight(n->right));
}
}
相当标准的递归 treeHeight 函数,用于给定的二叉搜索树 binaryTree。现在,我正在帮助一个朋友(他正在学习算法课程),我遇到了这个函数的一些奇怪问题,我无法 100% 向他解释。
当 max 被定义为 max(a,b) ((a)>(b)?(a):(b))(恰好是 windef.h 中的 max 定义)时,递归函数会出现问题(它运行类似于 n^n 的时间,而 n 是树的高度)。这显然使得检查具有 3000 个元素的树的高度需要非常非常长的时间。
但是,如果 max 是通过模板定义的,就像 std 那样,一切都很好。所以使用std::max 解决了他的问题。我只是想知道为什么。
另外,为什么countLeaves 函数可以正常工作,使用相同的编程递归?
int binaryTree::countLeaves(node *n) {
if (n == NULL) {
return 0;
} else if (n->left == NULL && n->right == NULL) {
return 1;
} else {
return countLeaves(n->left) + countLeaves(n->right);
}
}
是不是因为在返回三元函数时,a => countLeaves(n->left) 和 b => countLeaves(n->right) 的值被递归地调用 double 只是因为它们是结果?
谢谢!
问题在下面得到回答
我只是想链接一些有关该主题的文献以供将来参考:
http://www.boostpro.com/tmpbook/preprocessor.html
http://msdn.microsoft.com/en-us/library/z3f89ch8.aspx
这两种实现的主要区别是:
#define max(i, j) (((i) > (j)) ? (i) : (j))
对
template<class T> T max (T i, T j) { return ((i > j) ? i : j) }
谢谢大家!
【问题讨论】:
-
用它的定义替换 max 宏,你就会明白为什么了。
-
这两个功能都可以正常工作。第一个失败的唯一原因是它使用了
max宏。第二个没有。 -
宏是邪恶的。避免使用它们,直到您确定没有其他方法(通过经验知道什么时候会更容易)。
标签: c++ recursion binary-tree