二叉树递归方法的直径

时间:2019-07-04 13:48:59

标签: c++ recursion

我正在尝试使用递归找到直径,我对递归感到困惑

我尝试过的一些测试用例在某个时候我得到了正确的答案 发生整数溢出,但是以下作者的解决方案被相同的数据类型接受

我的方法:

对于每个节点,经过它的最长路径的长度=左侧子树的MaxDepth +右侧子树的MaxDepth。

我的问题是我的实现有什么问题

  class Solution {
  public:
      int mx = 0;
      int solve(TreeNode* root) {
          if (root == NULL)return 0;
          int leftheight = diameterOfBinaryTree(root->left) + 1;
          int rightheight = diameterOfBinaryTree(root->right) + 1;
          mx = max(mx, leftheight + rightheight);
          return max(leftheight, rightheight);
      }
      int diameterOfBinaryTree(TreeNode* root) {
          solve(root);
          return mx;
      }

  };

作者方法:相同的方法,但递归实现不同

  class Solution {
  public:
      int maxdiadepth = 0;

      int dfs(TreeNode* root) {
          if (root == NULL) return 0;

          int leftdepth = dfs(root->left);
          int rightdepth = dfs(root->right);

          if (leftdepth + rightdepth > maxdiadepth) maxdiadepth = leftdepth + rightdepth;
          return max(leftdepth + 1, rightdepth + 1);
      }

      int diameterOfBinaryTree(TreeNode* root) {
          dfs(root);

          return maxdiadepth;
      }
  };

2 个答案:

答案 0 :(得分:0)

请考虑击中叶节点时的情况或只有一个节点的情况。您的算法返回2,这是不正确的。出现此问题的原因是,无论如何,您都通过向左/右子树添加一个来计算高度。

要解决此问题,请在返回高度时添加一个,例如:max(leftheight, rightheight) + 1

顺便说一句,当您递归调用时,应该执行solve(root->left)solve(root->right)而不是diameterOfBinaryTree(root->left):P

答案 1 :(得分:0)

在可行的实现中,递归dfs调用返回子树的最大深度。

在您的实现中,递归diameterOfBinaryTree调用返回当前累积的直径近似值。您将其分配给名为leftheightrightheight的变量-这具有误导性;该值实际上不是左或右子树的高度。