给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
解题思路:
class Solution {
// 方法1:递归
public int maxDepth(TreeNode root) {
if(root == null) return 0;
return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1;
}
}
时间复杂度:O(n),每个节点在递归中只被遍历一次。
空间复杂度:O(height),递归函数需要栈空间,而栈空间取决于递归的深度,因此空间复杂度等价于二叉树的高度。
class Solution {
// 方法2:非递归
public int maxDepth(TreeNode root) {
if(root == null) return 0;
Queue<TreeNode> queue = new LinkedList<>();
int ans = 0;
// 1. 首先将头节点加入队列
queue.add(root);
// 2. 当队列不为空
while(!queue.isEmpty()) {
// 3. 判断每一层的节点个数
int len = queue.size();
ans++;
for(int i = 0; i < len; i++) {
// 4. 取出队列中的节点
TreeNode cur = queue.remove();
// 5. 如果当前节点存在左右节点,将左右节点加入队列
if(cur.left != null) queue.add(cur.left);
if(cur.right != null) queue.add(cur.right);
}
}
// 6. 返回最后的结果
return ans;
}
}
时间复杂度:O(n),每个节点只会被访问一次。
空间复杂度:O(n),其在最坏情况下队列存储的元素数量会达到 O(n)。