计算二叉树的高度作为void函数

问题描述

我正在学习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;
}