news 2026/8/16 6:43:44

【力扣hot100】二叉树专题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【力扣hot100】二叉树专题

文章目录

      • 104.二叉树的最大深度
      • 226. 翻转二叉树
      • 101.对称二叉树
      • 543. 二叉树的直径
      • 102.二叉树的层序遍历
      • 108. 将有序数组转换为二叉搜索树

104.二叉树的最大深度

104. 二叉树的最大深度

递归

/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */classSolution{publicintmaxDepth(TreeNoderoot){if(root==null)return0;intleft=maxDepth(root.left);intright=maxDepth(root.right);returnMath.max(left,right)+1;}}

226. 翻转二叉树

226. 翻转二叉树

先递归到底,再交换

/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */classSolution{publicTreeNodeinvertTree(TreeNoderoot){if(root==null)returnnull;invertTree(root.left);invertTree(root.right);TreeNodetemp=root.left;root.left=root.right;root.right=temp;returnroot;}}

101.对称二叉树

101. 对称二叉树

将整棵树的对称问题,转化为判断“左子树”和“右子树”是否互为镜像。通过check函数,每次递归都严格比较两个节点的值是否相等,然后让左节点的“左孩子”与右节点的“右孩子”对比,同时让左节点的“右孩子”与右节点的“左孩子”对比(即交叉比较),一路递归到底,只要所有交叉对应的节点都匹配,整棵树就是对称的

/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */classSolution{publicbooleanisSymmetric(TreeNoderoot){returncheck(root.left,root.right);}publicbooleancheck(TreeNodeleft,TreeNoderight){//两边都为空 对称if(left==null&&right==null)returntrue;//只有一边为空或者值不同 不对称if(left==null||right==null||left.val!=right.val)returnfalse;//继续向下交叉比较returncheck(left.left,right.right)&&check(left.right,right.left);}}

543. 二叉树的直径

543. 二叉树的直径

遍历二叉树,在计算最大深度的同时,顺带把直径算出来

在当前节点拐点的直径长度 = 左子树的最大深度 + 右子树的最大深度

返回给父节点的是当前子树的最大深度= max(左子树的最大深度,右子树的最大深度)+1

/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */classSolution{privateintres=0;publicintdiameterOfBinaryTree(TreeNoderoot){maxDepth(root);returnres;}publicintmaxDepth(TreeNoderoot){if(root==null)return0;intleft=maxDepth(root.left);intright=maxDepth(root.right);res=Math.max(res,left+right);returnMath.max(left,right)+1;}}

102.二叉树的层序遍历

102. 二叉树的层序遍历

BFS

  • cur数组存当前正在遍历的节点
  • nxt数组存被遍历节点的左右子节点
  • vals数组存部分答案
  1. 遍历cur,把左右子节点记录到nxt中,同时把节点值记录到数组vals中,遍历结束后把vals加到答案里
  2. 遍历结束把cur替换成nxt,开始下一轮循环
  3. cur不为空就证明还没遍历完
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */classSolution{publicList<List<Integer>>levelOrder(TreeNoderoot){if(root==null)returnList.of();List<List<Integer>>ans=newArrayList<>();List<TreeNode>cur=List.of(root);while(!cur.isEmpty()){List<TreeNode>nxt=newArrayList<>();List<Integer>vals=newArrayList<>(cur.size());for(TreeNodenode:cur){vals.add(node.val);if(node.left!=null)nxt.add(node.left);if(node.right!=null)nxt.add(node.right);}cur=nxt;ans.add(vals);}returnans;}}

优化一下,把cur数组和nxt数组用一个队列替代

/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */classSolution{publicList<List<Integer>>levelOrder(TreeNoderoot){if(root==null)returnList.of();List<List<Integer>>ans=newArrayList<>();Queue<TreeNode>q=newArrayDeque<>();q.add(root);while(!q.isEmpty()){intn=q.size();List<Integer>vals=newArrayList<>(n);while(n>0){TreeNodenode=q.poll();vals.add(node.val);if(node.left!=null)q.add(node.left);if(node.right!=null)q.add(node.right);n--;}ans.add(vals);}returnans;}}

108. 将有序数组转换为二叉搜索树

108. 将有序数组转换为二叉搜索树

平衡二叉搜索树:每个节点的左子树和右子树高度相差不超过1

由于给定的数组是严格升序的,要构建一棵高度平衡的二叉搜索树(BST),关键在于每次都选取当前区间的中间元素作为根节点,这样能保证左右子树的节点数量尽可能相等;随后,以中间元素为界,将数组一分为二,递归地对左半区间构建左子树、对右半区间构建右子树,直到区间越界(left > right)时返回null作为递归出口,最终自底向上拼接出一棵完美的平衡二叉搜索树。

/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */classSolution{publicTreeNodesortedArrayToBST(int[]nums){returnbuild(nums,0,nums.length-1);}publicTreeNodebuild(int[]nums,intleft,intright){if(left>right)returnnull;intmid=(left+right)/2;TreeNoderoot=newTreeNode(nums[mid]);root.left=build(nums,left,mid-1);root.right=build(nums,mid+1,right);returnroot;}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/16 6:41:34

Windows文件被占用无法删除?从原理到实战的完整解决方案

1. 引言&#xff1a;当文件“赖”在资源管理器里不走时你有没有遇到过这种情况&#xff1f;在Windows里想删除一个文件或文件夹&#xff0c;系统却弹出一个冷冰冰的提示框&#xff1a;“操作无法完成&#xff0c;因为文件已在另一个程序中打开。” 你关掉了所有能想到的软件&am…

作者头像 李华
网站建设 2026/8/16 6:31:10

毕业挖到的隐形黑马✨真的后悔没早点发现Paperxie

写论文最崩溃的不是写不出字&#xff0c;而是明明很简单的事&#xff0c;却被各种工具折腾到心态炸裂。 查重花钱、降重翻车、写综述全是水、格式改八百遍、答辩慌到失语。 直到定稿完我才敢真心说一句&#xff1a;Paperxie真的是被严重低估的毕业神器。 它没有乱七八糟的广…

作者头像 李华
网站建设 2026/8/16 6:27:51

Ubuntu 20.04 LTS 部署达梦数据库DM8全流程详解与避坑指南

1. 项目概述&#xff1a;为什么要在Ubuntu上部署DM8&#xff1f;最近在帮一个做数据分析的朋友搭建测试环境&#xff0c;他那边有个项目需要用到国产数据库。聊了一圈&#xff0c;最后锁定了达梦数据库&#xff08;DM8&#xff09;。他那边开发机清一色都是Ubuntu&#xff0c;所…

作者头像 李华
网站建设 2026/8/16 6:27:49

AI智能体WorkBuddy实战:管理者如何借力AI提升会议与项目管理效率

1. 从“AI玩具”到“管理者副驾”&#xff1a;WorkBuddy的定位再审视最近在团队内部做工具选型&#xff0c;一个绕不开的话题就是“AI智能体”。市面上从Dify、Coze到各种开源框架&#xff0c;选择多到让人眼花缭乱。但当我真正把WorkBuddy丢给几个不同层级的管理者试用后&…

作者头像 李华
网站建设 2026/8/16 6:27:38

CSS文本对齐实战指南:从基础到高级应用

1. 文本对齐的基础认知在网页排版中&#xff0c;文本对齐是最基础却最容易被忽视的视觉控制手段。text-align属性就像排版工人的标尺&#xff0c;它决定了文字在容器中的水平排列方式。这个看似简单的属性背后&#xff0c;其实影响着整个页面的阅读节奏和视觉平衡。我刚入行时曾…

作者头像 李华
网站建设 2026/8/16 6:27:34

数据结构高效学习指南:从核心概念到实战应用

1. 先搞清楚“划重点”到底在划什么看到“教材划重点”这个标题&#xff0c;很多同学第一反应是去找一份现成的知识点清单&#xff0c;然后开始背诵。但如果你真的这么做了&#xff0c;大概率会陷入“背了忘&#xff0c;忘了背”的循环&#xff0c;尤其是面对像《数据结构&…

作者头像 李华