携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第8天,点击查看活动详情 >>
每日三刷,剑指千题
计划简介:
- 每日三题,以中等题为主,简单题为辅进行搭配。保证质量题1道,数量题3道。
- 每日早通勤在LeetCode手机端选题,思考思路,没答案的直接看题解。
- 每日中午进行编码,时间控制在一小时之内。
- 下班前半小时进行整理总结,并发布到掘金每日更文活动。
说明:
- 基于以前的刷题基础,本次计划以中等题为主,大部分中等题都可以拆分为多个简单题,所以数量保证3,质量保证一道中等题即可。
- 刷题顺序按照先刷链表、二叉树、栈、堆、队列等基本数据结构,再刷递归、二分法、排序、双指针等基础算法,最后是动态规划、贪心、回溯、搜索等复杂算法。
- 刷题过程中整理相似题型,刷题模板。
- 目前进度 102/1000 。
新阶段
经过6天,18题,链表暂告一段落,我们来刷二叉树。
因为二叉树的题之前刷的比较少,第一天先从简单题开始。
[111]二叉树的最小深度
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明: 叶子节点是指没有子节点的节点。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:2
解析
Code
自底向上递归
private int extracted(TreeNode root) {
if (root ==null){
return 0;
}
int left = minDepth(root.left);
int right = minDepth(root.right);
if (root.left==null|| root.right==null){
return left+right+1;
}
return Math.min(left,right)+1;
}
层次遍历
public int minDepth(TreeNode root) {
if (root == null)return 0;
int depth = 1;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()){
int n = queue.size();
for (int i = 0; i < n; i++) {
TreeNode node = queue.poll();
if (node.left==null&&node.right==null){
return depth;
}
if (node.left!=null){
queue.offer(node.left);
}
if (node.right!=null){
queue.offer(node.right);
}
}
depth++;
}
return depth;
}
[剑指 Offer 55 - I]二叉树的深度
输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。
例如:
给定二叉树 [3,9,20,null,null,15,7]
,
3
/ \
9 20
/ \
15 7
返回它的最大深度 3 。
解析
最大换成最小即可。
Code
class Solution {
public int maxDepth(TreeNode root) {
if (root == null){
return 0;
}
int left = maxDepth(root.left);
int right = maxDepth(root.right);
if (root.left == null || root.right == null){
return left + right + 1;
}
return Math.max(left,right)+1;
}
}
[1302]层数最深叶子节点的和
给你一棵二叉树的根节点 root
,请你返回 层数最深的叶子节点的和 。
示例 1:
输入:root = [1,2,3,4,5,null,6,7,null,null,null,null,8]
输出:15
解析
Code
class Solution {
public int deepestLeavesSum(TreeNode root) {
if (root==null)return 0;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
Integer depth = 1;
Integer sum = 0;
while (!queue.isEmpty()){
sum = 0;
int n = queue.size();
for (int i = 0; i < n; i++) {
TreeNode node = queue.poll();
if (node.right == null&&node.left==null){
sum+=node.val;
}
if (node.right!=null){
queue.offer(node.right);
}
if (node.left!=null){
queue.offer(node.left);
}
}
depth++;
}
return sum;
}
}
\