1. 题目描述
2. 解题思路
对于二叉树来说,递归yyds,对于本道题目而言,递归也是最简单的实现方法,即深度优先搜索,简单分析即可知道每一层的深度是孩子的最大深度加一。
太简单了有点不过瘾,想用迭代来实现一下,简单分析便可知道使用迭代必须把每一层节点的子节点存储起来,用于下一次的迭代中,突然发现,这不就是广度优先搜索的思想嘛,对于这个子节点存储用什么数据结构我们还是要考虑一下的,应该是要先访问先处理,换言之也就是先进先出的数据结构——栈。
3. 代码实现
3.1 递归(深度优先搜索)
public int maxDepth(TreeNode root) {
if (root == null)
return 0;
return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1;
}
3.2 迭代(广度优先搜索)
public int maxDepth(TreeNode root) {
int count = 0;
LinkedList<TreeNode> treeNodes = new LinkedList<>();
treeNodes.add(root);
TreeNode template;
int size;
while (!treeNodes.isEmpty()) {
System.out.println("==============");
count++;
size = treeNodes.size();
for (int i = 0; i < size; i++) {
template = treeNodes.removeFirst();
if (template != null) {
System.out.println(template.val);
treeNodes.add(template.left);
treeNodes.add(template.right);
}
}
}
return count - 1;
}
3.3 对比
无论深度优先搜索还是广度优先搜索,他们都需要访问每一个节点,因此他们的时间复杂度都是O(n)。对于空间复杂度而言,深度优先搜索时的栈深度其实就是树的深度,即O(height),最优的情况可以达到O(log n),最差的情况则是O(n);而对于广度优先搜索,其消耗的储存空间主要是储存同一层中的节点所需要的栈空间,因此最大的空间复杂度应是O(n/2)=O(n)。