关于树的深度
Preface
不知道大家怎么想树的题,反正叔叔我啊一看见树的题啊,就想起递归了~
关于树的深度呢,其实更准确的说是二叉树,因为只有二叉树比较好出题(不是。是因为二叉树对于查找、压缩方面有巨大应用,当然啦,这里也不过多赘述。
回到主题,讲到深度,其实就是去探索,不断的向下搜索的的过程。那么讲到搜索金额探索,就自然而然想到BFS和DFS两种搜索算法啦。
Solution
104. 二叉树的最大深度
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回它的最大深度 3 。
看着题,容易写出DFS的版本,递归即可,这里我蠢了,代码不够简洁,其实可以一行即可。。。
#include <iostream>
#include <algorithm>
using namespace std;
struct TreeNode
{
int val;
TreeNode *left, *right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
class Solution {
public:
int max_deep(TreeNode* root, int deep)
{
if (root == nullptr)
return deep;
else
{
auto deep_left = root->left == nullptr ? deep : max_deep(root->left, deep + 1);
auto deep_right = root->right == nullptr ? deep : max_deep(root->right, deep + 1);
return max(deep_left, deep_right);
}
}
int maxDepth(TreeNode* root) {
return root == nullptr ? 0 : max_deep(root, 1);
}
};
这里相信大家能看出来,没有把condition给提炼出来,多了几个判断,还是很伤的。。。
很简洁的版本在reference部分,我就不在这里展示出来的。
下面重点说说BFS的部分,BFS难点在于记住现在是几层,因为BFS是扩散寻找,所以很难讲我现在就在left和right端对比加一的方法。所以我们另辟蹊径,采取每一次走一层的方法,具体在于我用一个queue,每一阶段所有的queue的里面都是同一层的。理由是,我先放入root(假设不为nullptr),那是不是现在我的root就是一层,那我把现阶段所有的queue都遍历一遍,下一次是不是所有的就在第二层了,以此类推。每次遍历完就加一即可。
#include <iostream>
#include <queue>
using namespace std;
struct TreeNode
{
int val;
TreeNode *left, *right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
class Solution {
public:
int maxDepth(TreeNode* root) {
queue<TreeNode*> q;
auto res = 0;
if (root != nullptr) q.push(root);
while (q.empty())
{
auto size = static_cast<int>(q.size());
while (size-- > 0)
{
auto top = q.front();
q.pop();
if (top->left != nullptr) q.push(top->left);
if (top->right != nullptr) q.push(top->right);
}
++res;
}
return res;
}
};