20天速通LeetCodeday11:二叉树进阶

前言

再熟悉遍历的基础上,掌握二叉树常见的变换手段,例如路径求和;节点值向上汇总求和,层的求和等

104:二叉树的最大深度

题目要求:给定一个二叉树root,要求返回最大深度。

核心思想(递归)

运用递归的思想,遍历二叉树的左右节点,得到最大深度

代码实现

java 复制代码
class Solution {
    public int maxDepth(TreeNode root) {
        if(root==null){
            return 0;
        }
        //遍历左子树
        int leftDepth=maxDepth(root.left);
        //遍历右子树
        int rightDepth=maxDepth(root.right);

        return Math.max(leftDepth,rightDepth)+1;
    }
}

总结

递归属于抽象理解,想要掌握递归思路,要再脑海中想象出递归的流程步骤就非常容易掌握。

98:验证二叉搜索树

题目要求:

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

节点的左子树只包含 严格小于 当前节点的数。

节点的右子树只包含 严格大于 当前节点的数。

所有左子树和右子树自身必须也是二叉搜索树。

核心思路(递归+中序遍历)

一句话:

用中序遍历模拟节点从小到大的顺序,只要发现顺序不对,就不是BST

递归中序遍历整棵树

维护一个变量prev,保存上一个访问节点的值

当前节点的值必须严格大于prev

代码实现

java 复制代码
long prev=Long.MIN_VALUE;
public boolean isValidBST(TreeNode root) {
return inorder(root);
}
public boolean inorder(TreeNode node){
if(node==null){return true;}
//左
if(!inorder(node.left)){return false;}
//中
if(node.val<=prev){return false;}
prev=node.val;
//右
return inorder(node.right);
}

总结

通过递归中序遍历整棵树,来判断是否满足二叉搜索树

112:路径总和

题目要求:给定一个二叉树和一个整数 targetSum,判断树中是否存在从根节点到叶子节点的路径,使得路径上所有节点值之和等于 targetSum。

核心思路

递归遍历树:前序遍历(根 左 右)

更新剩余目标值:每到一个节点,减去当前节点值

到达叶子节点时检查剩余目标值

如果左右子树都不满足,返回false

代码实现

java 复制代码
if(root==null) return false;

if(root.left==null||root.righ==null){return targetSum==root.val;}

return hasPathSum(root.left,targetSum-root.val)||hasPathSum(root.left,targetSum-root.val);

总结

通过递归来遍历整个树。每次遍历完成后都更新targetSum的值,最后与叶子节点的值进行比较判断。

108:将有序数组转换位二叉搜索树

题目要求:给定一个整数数组nums,元素已经按照升序排列

要求:讲起转换为一个平衡二叉搜索树

核心思路

找到数组中间元素,作为根节点

中间元素左边的,作为左子树

右边的作为右子树

递归完成左右子树,返回根节点

代码实现

java 复制代码
public TreeNode sortedArrayToBST(int[] nums) {
       return build(nums,0,nums.length-1);
    }

public TreeNode build(int[] nums,int left,int right){
//终止条件
if(left>right)return null;
//找中点
int mid=left+(rigth-left)/2;
//创建根节点
TreeNode root=new TreeNode(nums[mid]);
//递归遍历创建左子树
root.left=build(nums,left,mid-1);
//递归创建右子树
root.rigth=build(nums,mid+1;right);

return root;
}

总结

二叉树中的left和right不是定值,题目会随着递归而更新。本题的核心思路就是"

创建根节点(中点),通过递归的方法创建左子树与右子树,最后返回根节点

662:二叉树最大宽度

题目要求;给定一个二叉树根节点root

要求:树中最大宽度(最左节点到最右节点的宽度,null也算)

核心思路

  1. BFS(广度优先搜索)遍历每一层节点
  2. 每个节点一个编号index
    根节点 index = 1
    左子节点 index = parent_index * 2
    右子节点 index = parent_index * 2 + 1
  3. 每一层
    记录 最左节点编号 start 和 最右节点编号 end
    层宽 = end - start + 1
  4. 遍历所有层,返回最大宽度

代码实现

java 复制代码
if(root==null) return 0;

int maxWidth=0;
//创建队列
Queue<Pair<TreeNode,Integer>> queue=new LinkedList<>();
queue.offer(new Pair(root,1));//根节点编号为1
//为后面循环作预处理
while(!queue.isEmpty()){
int size=queue.size();
int start=queue.peek.getValue();
int end=start;

for(int i=0;i<size;i++){
Pair<TreeNode,Integer> pair=queue.poll();
TreeNode node=pair.getKey();
int index=pair.getValue();
end=index;//更细右编号
if(node.left!=null) queue.offer(new Pair(node.left,index*2));
if(node.right!=null) queue.offer(new Pair(node.right,index*2+1));
}
mxaWidth=Math.max(maxwidth,end-start+1);
}
return maxWidth;

总结

用编号+BFS的方法来解决

掌握编号的计算

199:二叉树的右视图

题目要求:给定一个二叉树根节点root

要求:返回从右侧看到的节点值

核心思路

  1. BFS遍历树,每层按顺序处理节点
  2. 每一层的最后一个节点就是结果
  3. 将每层最后一个节点加入结果列表

代码实现

java 复制代码
List<Integer> res=new ArrayListed<>();
if(root==null) return res;

Queue<TreeNode> queue=new LinkedList<>();
queue.offer(root);

while(!queue.isEmpty){
int size=queue.size();
for(int i=0;i<size;i++){
TreeNode node=queue.poll();
//当前层最后一个节点,加入结果
if(i==size-1) res.add(node.val);

if(node.left!=null) queue.offer(node.left);
if(node.right!=null) queue.offer(node.right);
}
}
return res;

总结

本题要求最后一个节点,想到用BFS层遍历来获取最后一个节点

相关推荐
JieE2123 小时前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试
Jack2011 小时前
HarmonyOS开发中错误处理策略:网络异常统一处理
算法
小小杨树12 小时前
读懂色彩:拍照调色不再难
算法·计算机视觉·配色
JieE2121 天前
LeetCode 226. 翻转二叉树|JS 递归超详细拆解,二叉树入门经典题
javascript·算法
JieE2121 天前
LeetCode 104. 二叉树的最大深度|递归思路超详细拆解
javascript·算法
vivo互联网技术1 天前
CVPR 2026 | 全新强化学习框架 BeautyGRPO:重塑真实人像
算法·大模型·cvpr·影像
Darling噜啦啦1 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
用户497863050732 天前
(一)小红的数组操作
算法·编程语言
怕浪猫2 天前
Electron 系列文章封面图
算法·架构·前端框架