学习目标:
本次学习目标为 力扣初级算法-树,其中主要的LC如下:
- 二叉树的最大深度
学习内容:
- 二叉树的最大深度 -----([链接](https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnd69e/)
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。示例1:
给定二叉树 [3,9,20,null,null,15,7]
返回它的最大深度 3 。
3
/ \
9 20
/ \
15 7
解题思路:
-
解法一: 直接递归
-
代码实现:
/**
* 解法一: 直接递归
*/
public int maxDepth01(TreeNode root) {
return null == root ? 0 : Math.max(maxDepth01(root.left), maxDepth01(root.right)) + 1;
}
-
解法二: BFS
-
边界问题: 入参的树结构是空
-
代码逻辑过程:
- 声明双端队列
- 将根节点放入到双端队列中
- 声明深度 为 depthNum
- 当前层的个数,并循环遍历她的子节点
- 判断子节点是否存在,如果存在则继续加在双端队列的尾巴上
-
代码实现:
/**
* 解法二: BFS
*/
public int maxDepth02(TreeNode root) {
// 边界问题: 入参的树结构是空
if (null == root){
return 0;
}
// 声明双端队列
Deque<TreeNode> depthQueue = new LinkedList<>();
// 将根节点放入到双端队列中
depthQueue.push(root);
// 声明深度 为 depthNum
int depthNum = 0;
while (!depthQueue.isEmpty()){
// 当前层的个数,并循环遍历她的子节点
int size = depthQueue.size();
while (size -- > 0){
TreeNode currentNode = depthQueue.pop();
// 判断子节点是否存在,如果存在则继续加在双端队列的尾巴上
if (null != currentNode.left){
depthQueue.addLast(currentNode.left);
}
if (null != currentNode.right){
depthQueue.addLast(currentNode.right);
}
depthNum ++;
}
}
return depthNum;
}
-
解法三:
-
边界问题: 入参的树结构是空
-
代码逻辑过程:
- 声明两个栈,一个栈用来存放节点,一个栈用来存在层级
- 写入第一层相关的数据
- 循环遍历栈上所有的节点,同时入栈时,level 数只存最大的值
-
代码实现:
/**
* 解法三: DFS
*/
public int maxDepth03(TreeNode root) {
// 边界问题: 入参的树结构是空
if (null == root){
return 0;
}
// 声明两个栈,一个栈用来存放节点,一个栈用来存在层级
Stack<TreeNode> stack = new Stack<>();
Stack<Integer> level = new Stack<>();
// 写入第一层相关的数据
stack.push(root);
level.push(1);
int max = 0;
// 循环遍历栈上所有的节点,同时入栈时,level 数只存最大的值
while (!stack.isEmpty()){
TreeNode pop = stack.pop();
Integer tempLevel = level.pop();
max = Math.max(max, tempLevel);
if (null != pop.left){
stack.push(pop.left);
level.push(tempLevel + 1);
}
if (null != pop.right){
stack.push(pop.right);
level.push(tempLevel + 1);
}
}
return max;
}