当前位置: 首页 > news >正文

LeetCode hot 100 解题思路记录(二)

前情提要

本文是个人学习的粗糙笔记,仅记录思路和图解(跳过了困难题,等之后再弄)

视频看的是油管上的neetcode

二叉树

二叉树的中序遍历(简单)

中序遍历:访问顺序为左子树 → 根节点 → 右子树

思路一:迭代,遍历+栈

              列表和栈初始化、将当前节点所有左子节点入栈、弹出栈顶节点记录值、转到右子树

              左、中、右

思路二:Morris中序遍历(不想看,问问是否要多个思路来考核再来看)

代码实现用的是遍历+栈的思路

class Solution { public List<Integer> inorderTraversal(TreeNode root) { //初始化 List<Integer> ans = new ArrayList<>(); Deque<TreeNode> stk = new LinkedList<>(); //左节点入栈 while(root!=null || !stk.isEmpty()){//为什么用||而不是&&呢?只要还有左子树要处理、只要栈中还有待处理的节点,就还有节点要处理就得继续循环 while(root!=null){ stk.push(root); root=root.left; } root=stk.pop();//左节点出栈 ans.add(root.val);//保存左节点、中节点,有些节点是同时兼顾左节点和中节点角色 root=root.right;//保存右节点 } return ans; } }

二叉树的最大深度(简单)

思路一:深度优先搜索DFS

思路二:广度优先搜索BFS

代码实现用的是深度优先搜索DFS,从底向上统计,递归

class Solution { public int maxDepth(TreeNode root) { if(root==null){ return 0; } int L=maxDepth(root.left); int R=maxDepth(root.right); int ans=Math.max(L,R)+1; return ans; } }

翻转二叉树(简单)

思路:从下往上进行左右子树的翻转,用递归算法

class Solution { public TreeNode invertTree(TreeNode root) { if(root==null){//这个判断很重要,是递归的终止条件 return null; } TreeNode L=invertTree(root.left); TreeNode R=invertTree(root.right); root.left=R; root.right=L; return root; } }

对称二叉树(简单)

算法一:递归,双指针

p指针和q指针,最开始都指向树的根节点,随后p指针右移则q指针左移,p指针左移则q指针右移

代码步骤:函数包含,root拆解成left和right的参数

                  特殊情况,左右节点是否为null的判断

                  返回判断,左右节点值相等?左节点的左子节点与右节点的右子节点值相等?

                                                                 左节点的右子节点与右节点的左子节点相等?

class Solution { public boolean isSymmetric(TreeNode root) { return checked(root.right,root.left); } public boolean checked(TreeNode L, TreeNode R){ if(L==null && R ==null){//检查是否两个都为空 return true; } if(L==null || R==null){//检查是否一个为空一个非空 return false; } return L.val==R.val && checked(L.left,R.right) && checked(R.left, L.right); } }

用p和q指针比较好,用L和R有点绕。。。

算法二:迭代,队列

根节点初始化时加入队列两次

每次提取两个节点,比较值,再比较两节点的左右子节点的值(注意顺序)

当队列为空或检测到值不等时结束

二叉树的直径(简单)

递归,左子树深度+右子树深度

代码步骤:变量ans、主函数

         depth函数,特殊情况判断、左子树右子树递归、直径最大值保存、以该节点为根的子树深度

class Solution { int ans=0; public int diameterOfBinaryTree(TreeNode root) { //diameterof(root.left,root.right); depth(root); return ans; } public int depth(TreeNode node){ if(node==null){ return 0; } int L=depth(node.left); int R=depth(node.right); ans=Math.max(L+R,ans); return Math.max(L,R)+1; } }

二叉树的层序遍历

广度优先搜索BFS

结果列表、层列表、queue

代码步骤:初始化 ,结果列表、特殊情况判断

                                  queue、放root进队列

                  处理queue里的值,初始化层列表、queue的大小

                                                 node、node.left、node.right、层列表

     

//写一下思路 //结果列表、层列表、列表 //初始化结果列表,特殊情况判断 //初始化列表,root入队 //循环 层列表初始化 层列表大小 node出队到层列表中,node的左右子节点入队 class Solution { public List<List<Integer>> levelOrder(TreeNode root) { List<List<Integer>> ans=new ArrayList<>(); if(root==null){ return ans; } //Queue<TreeNode> queue= new ArrayQueue<>(); Queue<TreeNode> queue= new LinkedList<>(); queue.offer(root); while(!queue.isEmpty()){ List<Integer> level= new ArrayList<>(); int sizeofLevel=queue.size(); for(int i=1;i<=sizeofLevel;i++){ //TreeNode node= queue.pop(); TreeNode node= queue.poll(); level.add(node.val); if(node.left!=null){ queue.offer(node.left); } if(node.right!=null){ queue.offer(node.right); } } ans.add(level); } return ans; } }
  • offer(e):将元素加入队列尾部(FIFO顺序)。

  • poll():从队列头部移除并返回元素。

  • push(e):将元素压入栈顶(即链表头部,LIFO顺序)。

  • pop():从栈顶(头部)移除并返回元素。

  • Deque<TreeNode> queue = new LinkedList<>(); // 声明为 Deque,但当作队列用
    Deque<TreeNode> stack = new LinkedList<>(); // 声明为 Deque,但当作栈用

有序数组转换为二叉搜索树(简单)

知识点:平衡二叉树,左节点<根节点<右节点

思路:中序遍历,选择中间位置左边/右边/任意一边为根节点

int mid = (left + right) / 2;
int mid = (left + right + 1) / 2;
int mid = (left + right + rand.nextInt(2)) / 2;

代码步骤:

  1. 取中点:选当前区间中间位置的值作为根节点

  2. 递归左右

    • 左子树 = 左边区间(left 到 mid-1

    • 右子树 = 右边区间(mid+1 到 right

  3. 终止条件:当 left > right 时返回 null

class Solution { public TreeNode sortedArrayToBST(int[] nums) { return helper(nums,0,nums.length-1); } public TreeNode helper(int[] nums, int left,int right){ if(left>right){ return null; } int mid=(left+right)/2; TreeNode root = new TreeNode(nums[mid]); root.left=helper(nums,left,mid-1); root.right=helper(nums,mid+1,right); return root; } }

验证二叉搜索树

5<4, 所以不能只比较相邻左右子节点

比较时有左右边界

代码实现:中序遍历

class Solution { public boolean isValidBST(TreeNode root) { //Queue<TreeNode> queue= new ArrayQueue<>(); Deque<TreeNode> stack= new LinkedList<>(); double inorder = -Double.MAX_VALUE; while(root!=null || !stack.isEmpty()){ while(root!=null){ stack.push(root); root=root.left; } root=stack.pop();
http://www.jsqmd.com/news/944658/

相关文章:

  • Windows系统优化工具箱:从手动配置到一键自动化
  • 如何用Phi-3-Bangla-Instruct构建孟加拉语聊天机器人?完整代码示例与最佳实践
  • PyTorch自定义损失报错怎么办?教你一招避坑
  • 3分钟永久解锁IDM:开源激活脚本的完整免费方案
  • OptiScaler终极指南:打破硬件限制的游戏超分辨率与帧生成解决方案
  • 2026年6月干线物流自动驾驶「车路运能」一体化综合实力测评 - 外贸老黄
  • Beyond Compare 5密钥生成器:从逆向工程到多平台激活的完整指南
  • AutoMdxBuilder:终极自动化MDX词典制作完全指南
  • 从零打造桌面级六轴机械臂:Arduino控制、3D打印与运动编程全解析
  • dictalm2.0-instruct-fine-tuned API使用手册:开发者快速集成指南
  • InfluxDB 生产环境实战:降采样、数据保留策略与 Flux 查询语言深度解析
  • 有哪些AI论文网站是真的贴合学术规范,而不是通用套壳?
  • 【分享】手机数据全备份与恢复v5.7.49
  • COLMAP三维重建实战指南:从无序图像到精确三维模型的完整解决方案
  • 7周通关大厂面试:Coding Interview University终极学习指南
  • 如何快速掌握Illustrator脚本:30个免费插件提升设计效率的终极指南
  • Linux系统编程-标准I/O与系统I/O的比较
  • OOTDiffusion推理加速实战:从分钟级到秒级的硬核调优之路
  • (干货整理)亲测好用的AI论文写作软件,毕业党收藏备用
  • 基于MOSFET与RC电路的延时开关设计:从原理到实践
  • FLUX.1-dev精度评估:ClipScore与Hpsv2测试全流程
  • 终极免费开源甘特图工具:GanttProject如何解决你的项目管理难题?
  • Linux 内核中的 sendfile:从上下文切换到零拷贝
  • 终极指南:5分钟快速上手RPG Maker解密工具,轻松提取加密游戏资源
  • 网络通信详细总结
  • AI剪辑长视频做录播,重点从来不是画面!
  • 终极指南:3分钟快速上手RPG Maker解密工具,轻松提取加密游戏资源
  • 如何让旧Mac焕发新生:3步解锁突破性系统兼容方案
  • Python自动化实战:从脚本工具到自动化框架的演进之路
  • Android通用SDR驱动:将移动设备变成专业无线电接收站的技术革命