问题描述
我正在学习C ++,并尝试编写一个void函数来计算Node的高度。该函数必须为void类型,因此它不能返回任何内容,但应正确计算节点的高度。下面是我的代码:
void computeHeight(Node *n) {
if (!n->left && !n->right){
n->height = 0;
}
else if (n->left && !n->right){
n->height = 1 + computeHeight(n->left);
}
else if (!n->left && n->right){
n->height = 1 + computeHeight(n->right);
}
else {
if (computeHeight(n->left) > computeHeight(n->right)){
n->height = 1 + computeHeight(n->left);
}
else {
n->height = 1 + computeHeight(n->right);
}
}
}
我认为我遇到了错误,因为它不喜欢void函数中的运算符,例如“ +”。请指教!
解决方法
我假设您不允许更改函数的返回类型(即使它强制执行一个相当奇怪的实现)
您不能将1
添加到computeHeight
的结果中,因为后者根本不返回任何内容。
但是,computeHeight
会执行某些操作。它有所谓的副作用。此效果是“ computeHeight(n)
完成后,n->height
将被设置为给定节点的高度(从叶子开始)”。您可以使用它:
else if (n->left && !n->right){
computeHeight(n->left);
n->height = 1 + n->left->height;
}
在最后一种情况下,您需要首先computeHeight
两个子树,然后比较副作用:
else {
computeHeight(n->left);
computeHeight(n->right);
n->height = 1 + std::max(n->left->height,n->right->height); //slightly refactored ;)
}
,
您的代码可以固定和简化,如下所示(未经测试):
void computeHeight(Node *n) {
if (!n)
return;
computeHeight(n->left);
computeHeight(n->right);
auto left_height = n->left ? n->left->height : 0;
auto right_height = n->right ? n->right->height : 0;
n->height = std::max(left_height,right_height) + 1;
}