我正在尝试使用递归找到直径,我对递归感到困惑
我尝试过的一些测试用例在某个时候我得到了正确的答案 发生整数溢出,但是以下作者的解决方案被相同的数据类型接受
我的方法:
对于每个节点,经过它的最长路径的长度=左侧子树的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;
}
};
答案 0 :(得分:0)
请考虑击中叶节点时的情况或只有一个节点的情况。您的算法返回2,这是不正确的。出现此问题的原因是,无论如何,您都通过向左/右子树添加一个来计算高度。
要解决此问题,请在返回高度时添加一个,例如:max(leftheight, rightheight) + 1
顺便说一句,当您递归调用时,应该执行solve(root->left)
或solve(root->right)
而不是diameterOfBinaryTree(root->left)
:P
答案 1 :(得分:0)
在可行的实现中,递归dfs
调用返回子树的最大深度。
在您的实现中,递归diameterOfBinaryTree
调用返回当前累积的直径近似值。您将其分配给名为leftheight
和rightheight
的变量-这具有误导性;该值实际上不是左或右子树的高度。