我正在尝试做LeetCode问题111.二叉树的最小深度
给定二叉树,找出它的最小深度。 最小深度是从根节点到最近的叶节点沿最短路径的节点数。 注释:A叶是一个没有子节点的节点。
我的代码运行,但根本不改变最小深度值。我问过我的同学和老师,但他们也不知道为什么不行。我花了很多时间想办法弄清楚。
这是我的密码:
class Solution {
public:
int minHeight = 0, currHeight = 0;
int minDepth(TreeNode* root) {
searchTree(root);
return minHeight;
}
void searchTree(TreeNode* p) {
currHieght++;
if (p->right == nullptr && p->left == nullptr)
{
if (currHeight < minHeight) minHeight = currHeight--;
return;
}
else if (p->right == nullptr)
searchTree(p->left);
else if (p->left == nullptr)
searchTree(p->right);
else
{
searchTree(p->left);
searchTree(p->right);
currHeight--;
}
}
};
不管输入是什么,我的代码总是返回0。我做错了什么?
发布于 2022-10-07 20:01:34
代码中存在以下问题:
minHeight
被初始化为0,因此它永远不会得到更大的值。这意味着无论您的代码得到什么输入,它都将始终返回0。minHeight
应该设置为一个非常大的值,比如INT_MAX
,这样任何叶子的深度都会比初始值小。currHeight
并不总是在它应该减少的时候减少。无论if ...else if ... else if ...
结构中的情况如何-- currHeight
应该减少。对于这两个中间的情况,没有这样做。更好的做法是在一个共同的地方,在函数体的末尾执行这个currHeight--
。下面是包含这些更正的代码:
int minHeight = INT_MAX, // Set at an extreme high value
currHeight = 0;
int minDepth(TreeNode* root) {
if (root != nullptr) return 0; // boundary case: empty tree
searchTree(root);
return minHeight;
}
void searchTree(TreeNode* p) {
currHeight++;
if (p->right == nullptr && p->left == nullptr)
{
// Don't increase currHeight here, but at a common spot in the code
if (currHeight < minHeight) minHeight = currHeight;
}
else if (p->right == nullptr)
searchTree(p->left);
else if (p->left == nullptr)
searchTree(p->right);
else
{
searchTree(p->left);
searchTree(p->right);
}
currHeight--; // Always do this
}
请注意,这不是解决问题的最有效方法。该算法将访问所有节点,而宽度优先遍历可以在找到叶子后立即停止。
下面是一个使用广度优先遍历的扰流解决方案:
`int minDepth(TreeNode* root) { if (root == nullptr) return 0; vector<TreeNode*> level, nextLevel; level.push_back(root); for (int depth = 1; true; depth++) { nextLevel.clear(); for (auto node : level) { if (node->left == nullptr && node->right == nullptr) return depth; // found the first leaf: solved! if (node->left != nullptr) nextLevel.push_back(node->left); if (node->right != nullptr) nextLevel.push_back(node->right); } level = nextLevel; // copy } }`
https://stackoverflow.com/questions/73990932
复制相似问题