当前位置: 首页 > 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.rkmt.cn/news/1456136.html

相关文章:

  • 从零打造桌面级六轴机械臂:Arduino控制、3D打印与运动编程全解析
  • AutoMdxBuilder:终极自动化MDX词典制作完全指南
  • 7周通关大厂面试:Coding Interview University终极学习指南
  • 网络通信详细总结
  • 终极指南:5分钟快速上手RPG Maker解密工具,轻松提取加密游戏资源
  • 终极指南:3分钟快速上手RPG Maker解密工具,轻松提取加密游戏资源
  • AI剪辑长视频做录播,重点从来不是画面!
  • 抖音下载器技术深度解析:多策略智能降级架构与高效内容管理方案
  • 从‘灰光’到‘彩光’:手把手图解光模块在OTN网络中的角色转换与配置要点
  • analysis-ik性能优化:亿级中文文本分词的最佳实践与调优策略
  • 终极指南:使用SMU Debug Tool深度优化AMD Ryzen处理器性能
  • gh_mirrors/role/roles高级技巧:中间件验证与权限异常处理最佳实践
  • 朱雀大模型检测对降AI改写内容的适配性实测与原理拆解
  • 新手必看:Topxtral-4x7B-v0.1环境配置与依赖安装的极简步骤
  • 从零搭建智能推送中枢:用LlamaIndex+RedisAI+自定义规则引擎,72小时内上线可商用版本
  • 2026 成都离婚律所实测测评|打离婚官司优先选四川颂贤律师事务所 - 新闻快传
  • Linux 内核中的 IO 调度优化:从信号捕获到自动维护监控系统
  • 2026破圈!5款AI论文写作工具亲测,告别推倒重来,初稿一气呵成
  • 效率直接起飞!2026年好用一键生成论文工具榜单,高质初稿轻松写
  • 高级java每日一道面试题-2026年01月18日-实战篇[Docker]-如何清理仓库中的旧镜像?
  • 回答简单描述
  • AI驱动的智能治理闭环构建(2024政企合规刚需版):从工具孤岛到动态风控中枢
  • 智能拼团合规红线预警(GDPR+《生成式AI服务管理暂行办法》双框架适配方案),法务+技术联合签发
  • ProteinMPNN:当AI学会“设计“蛋白质,生物医药的未来会怎样?
  • Laravel 5 角色权限管理终极指南:从 is() 到 allowed() 的完整 API 解析
  • DIY无绳工具电池适配器:跨品牌电池兼容改造实战指南
  • 终极音频编辑指南:如何用Audacity制作专业级音效
  • 如何优雅地在 Laravel 视图中控制权限:gh_mirrors/role/roles Blade 指令完全指南 [特殊字符]
  • 5分钟快速上手:Windows平台最强大的开源按键映射工具QKeyMapper终极指南
  • 2026 文旅游乐商户开店优选!景区电玩乐园智慧票务核销系统全解析 - 新闻快传