版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Hanani_Jia/article/details/82777968
在领扣上刷题遇到了求二叉树深度的题目。对于二叉树的深度求解已经很熟悉了通过一个递归五行代码直接解决问题。
这是题目,自然直接编写程序。
class Solution {
public:
int maxDepth(TreeNode* root) {
if (root == NULL)
return 0;
return (maxDepth(root->right)>maxDepth(root->left) ? (1 + maxDepth(root->right)) : (1 + maxDepth(root->left)));
}
};
这是我最初编写的程序,如果说你执行代码返回了正确的值3,但是当你想要提交解答的时候你就发现。不能直接ac
惊了!!!!,这个树虽然程序是正确的,但是因为递归直接让你的程序时间复杂度到了十好几ms直接超出时间限制了,我.....这我....还没有写过二叉树深度的非递归。
但是我们之前写过二叉树的层序遍历,这里自然就是用相同的思想,一层一层的,设置一个计数器,每层加个一就完成了。
class Solution {
public:
int maxDepth(TreeNode* root) {
if (root == NULL)
return 0;
queue<TreeNode*> tree;
tree.push(root);
int ret = 0;
while (!tree.empty())
{
int n = tree.size();
for (int i = 0; i < n; i++)
{
TreeNode *now = tree.front();
tree.pop();
if (now->left)
{
tree.push(now->left);
}
if (now->right)
{
tree.push(now->right);
}
}
ret++;
}
return ret;
}
};
这样直接就能ac了。我们用了C库中提供的容器queue,自然用栈也是可以的,但是我感觉还是队列简单一点。
我们先把根节点入进来,然后让根出的同时,如果他的左右孩子有不为空的,那就让孩子进来,我们每次开始for循环之前队列里边的数据都是当前这一层的数据,让这层数据慢慢出,每次出一个数据他的孩子有不是空的就让他进来,每次for循环结束计数器加一。
这时候就能通过我们的测试了。如果我们想层序遍历那直接让我们每个数据出队列的时候进行一个输出就变成了我们二叉树的层序遍历。
这里再说一个问题就是我们当前在求的是二叉树的最大深度,如果我们要求最小深度怎么办
class Solution {
public:
int minDepth(TreeNode* root) {
if (root == NULL)
return 0;
if (root->left == NULL)
return minDepth(root->right) + 1;
if (root->right == NULL)
return minDepth(root->left) + 1;
else
{
//左右都不是空,那就找小的那个
return (minDepth(root->left) > minDepth(root->right) ? (minDepth(root->right) + 1) : (minDepth(root->left) + 1));
}
}
};
我们之前在求最大深度的时候是没有对结点孩子判断空的操作,但是这里是需要的
假如这是我们传入的数据,如果没有判断空,我们会在1不为空,然后开始返回1+他的左右孩子深度里边小的那个,就会返回0...这就导致程序出现了问题。所以我们需要进行判断,不然当出现结点只有一个孩子的时候就不往下走了,返回一个0.