二叉树的最大深度
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例题目:
给定二叉树 [3,9,20,null,null,15,7],
3
/
9 20
/
15 7
返回它的最大深度 3 。
节点的数据结构如下:
/
- Definition for a binary tree node.
- public class TreeNode {
-
int val;
-
TreeNode left;
-
TreeNode right;
-
TreeNode(int x) { val = x; }
- }
/*
思路一:最简单的解决办法是递归。一棵树的最大深度,等于其左右子树二者中的最大深度加上根结点带来的深度1。
当一个结点为null时,其深度为0。这就是递归的结束条件。
复杂度分析:
时间复杂度:我们每个结点只访问一次,因此时间复杂度为 O(N),
其中 N 是结点的数量。
空间复杂度:在最糟糕的情况下,树是完全不平衡的,例如每个结点只剩下左子结点,递归将会被调用 N 次(树的高度),因此保持调用栈的存储将是 O(N)。但在最好的情况下(树是完全平衡的),树的高度将log(N)。因此,在这种情况下的空间复杂度将是 O(log(N))。
具体递归过程如下:
主要代码实现:
2 public static int getMaxDepth(TreeNode root) {
3 if (root == null)
4 return 0;
5 else {
6 int left = getMaxDepth(root.left);
7 int right = getMaxDepth(root.right);
8 return 1 + Math.max(left, right);
9 }
}
思路二:将递归转换成迭代,采用队列分层存储每层节点 ,遍历每层后,下一层左右叶子节点若存在,则入队列,迭代开始操作节点前,计数变量记录层数。
通过创建FIFO队列,迭代每一层元素,每迭代一层,level+1
当一个根结点为null时,其深度为0。
复杂度分析:
时间复杂度为O(n),空间负杂度,取决于栈中元素,最坏情况为O(n)
主要代码实现:
public static int getMaxDepth(TreeNode root){
int levels = 0;
if(root==null) return levels;
//队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端 进行插入操作。LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while(!queue.isEmpty()){
levels++;
int size = queue.size();
for(int i = 0;i<size;i++){
root = queue.poll();
if(root.left!=null){queue.add(root.left)}
if(root.right!=null){queue.add(root.right)}
}
}
return levels;
}
}
参考文档:https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/solution/104java-di-gui-die-dai-by-ustcyyw/
参考文档:https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/solution/er-cha-shu-de-zui-da-shen-du-by-leetcode/