【LeetCode】初级算法案例+java代码(树篇)

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,内容安全 1000次 1年
对象存储 OSS,恶意文件检测 1000次 1年
简介: 【LeetCode】初级算法案例+java代码(树篇)

@TOC


# 前言 本文通篇基于TreeNode类进行解题,其代码如下,下面不再赘述: ```java 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; } } ```
# 一、二叉树的最大深度 ![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/de949b976fa54e82938c9d846fd80d6e.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAV1NLSDA5Mjk=,size_20,color_FFFFFF,t_70,g_se,x_16) ```java public int maxDepth(TreeNode root) { if(root==null){ return 0; } return search(root,1); } public int search(TreeNode root,int counter){ int n1 = counter,n2 = counter; if(root.left!=null){ n1 = search(root.left,counter+1); } if(root.right!=null){ n2 = search(root.right,counter+1); } return Math.max(n2, n1); } ```
# 二、验证二叉搜索树 ![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/f0f80dbc31234af7ad89925f45f40300.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAV1NLSDA5Mjk=,size_20,color_FFFFFF,t_70,g_se,x_16) ```java public boolean isValidBST(TreeNode root) { return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE); } public boolean isValidBST(TreeNode root, long min, long max) { if (root == null){ return true; } //每个节点如果超过这个范围,直接返回false if (root.val >= max || root.val <= min){ return false; } //这里再分别以左右两个子节点分别判断, //左子树范围的最小值是min,最大值是当前节点的值,也就是root的值,因为左子树的值要比当前节点小 //右子数范围的最大值是max,最小值是当前节点的值,也就是root的值,因为右子树的值要比当前节点大 return isValidBST(root.left, min, root.val) && isValidBST(root.right, root.val, max); } ```
# 三、对称二叉树 ![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/bea2e3216d824ab5abbafc782e0a0933.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAV1NLSDA5Mjk=,size_20,color_FFFFFF,t_70,g_se,x_16) ```java public boolean isSymmetric(TreeNode root) { if (root == null) return true; //从两个子节点开始判断 return search(root.left, root.right); } public boolean search(TreeNode left, TreeNode right) { //如果左右子节点都为空,说明当前节点是叶子节点,返回true if (left == null && right == null){ return true; } //如果当前节点只有一个子节点或者有两个子节点,但两个子节点的值不相同,直接返回false if (left == null || right == null || left.val != right.val){ return false; } //然后左子节点的左子节点和右子节点的右子节点比较,左子节点的右子节点和右子节点的左子节点比较 return search(left.left, right.right) && search(left.right, right.left); } ```
# 四、二叉树的层序遍历 ![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/1953cf9436ca4fb2a05d6287006ed06c.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAV1NLSDA5Mjk=,size_20,color_FFFFFF,t_70,g_se,x_16) ```java /** * 解题思路:深度优先搜索 */ public List> levelOrder(TreeNode root) { if(root==null){ return new ArrayList<>(); } List> reslut = new ArrayList<>(); // 将root节点值加入第一层 reslut.add(new ArrayList<>(List.of(root.val))); // 遍历子节点 return dfs(root.right,dfs(root.left,reslut,1),1); } public List> dfs(TreeNode cur,List> curList,int index){ if(cur==null){ // 如果当前节点为空,则直接返回 return curList; } if(index>=curList.size()){ // 说明没有遇到那么深的层数,向list中加层 curList.add(new ArrayList<>(List.of(cur.val))); }else{ // 说明遇到过那么深的层数,向list中获取该层,向其中加入当前节点值 curList.get(index).add(cur.val); } // 继续向子节点遍历 return dfs(cur.right,dfs(cur.left,curList,index+1),index+1); } ```
# 五、将有序数组转换为二叉搜索树 ![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/48158181b3944b24a8308d41c7dd6b2c.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAV1NLSDA5Mjk=,size_20,color_FFFFFF,t_70,g_se,x_16) ```java // 题中说了要转换为一棵高度平衡的二叉搜索树,并且数组又是排过序的,我们可以使用递归的方式 //每次取数组中间的值比如 m作为当前节点,m前面的值作为他左子树的结点值,m后面的值作为他右子树的节点值 public TreeNode sortedArrayToBST(int[] num) { if (num.length == 0){ return null; } return search(num, 0, num.length - 1); } public TreeNode search(int[] num, int start, int end) { if (start > end){ return null; } int mid = (start + end) / 2; TreeNode root = new TreeNode(num[mid]); root.left = search(num, start, mid - 1); root.right = search(num, mid + 1, end); return root; } ```
相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
目录
相关文章
|
21天前
|
监控 算法 网络协议
Java 实现局域网电脑屏幕监控算法揭秘
在数字化办公环境中,局域网电脑屏幕监控至关重要。本文介绍用Java实现这一功能的算法,涵盖图像采集、数据传输和监控端显示三个关键环节。通过Java的AWT/Swing库和Robot类抓取屏幕图像,使用Socket进行TCP/IP通信传输图像数据,并利用ImageIO类在监控端展示图像。整个过程确保高效、实时和准确,为提升数字化管理提供了技术基础。
57 15
|
3月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
112 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
13天前
|
运维 监控 算法
企业局域网监控软件中 Java 优先队列算法的核心优势
企业局域网监控软件是数字化时代企业网络安全与高效运营的基石,犹如一位洞察秋毫的卫士。通过Java实现的优先队列算法,它能依据事件优先级排序,确保关键网络事件如异常流量、数据泄露等被优先处理,保障系统稳定与安全。代码示例展示了如何定义网络事件类并使用PriorityQueue处理高优先级事件,尤其在面对疑似风险时迅速启动应急措施。这一核心技术助力企业在复杂网络环境中稳健前行,护航业务腾飞。
55 32
|
3天前
|
存储 监控 算法
剖析基于Java算法驱动的智能局域网管控之道
本文探讨了基于Java语言的局域网控制方案,结合链表数据结构与令牌桶算法,解决设备管理和流量调度难题。通过链表灵活存储网络设备信息,实现高效设备管理;令牌桶算法则精准控制流量,确保网络平稳运行。二者相辅相成,为校园、企业等局域网提供稳固高效的控制体系,保障业务连续性和数据安全。
|
12天前
|
存储 监控 Java
JAVA线程池有哪些队列? 以及它们的适用场景案例
不同的线程池队列有着各自的特点和适用场景,在实际使用线程池时,需要根据具体的业务需求、系统资源状况以及对任务执行顺序、响应时间等方面的要求,合理选择相应的队列来构建线程池,以实现高效的任务处理。
88 12
|
11天前
|
存储 监控 算法
探秘局域网桌面监控:深入剖析 Java 语言核心算法
在数字化办公时代,局域网桌面监控如同企业的“智慧鹰眼”,确保工作效率与数据安全。本文以Java为载体,揭示哈希表在监控中的关键应用。通过高效的数据结构和算法,哈希表能快速索引设备连接信息,大幅提升监控的时效性和响应速度。代码示例展示了如何用Java实现设备网络连接监控,结合未来技术如AI、大数据,展望更智能的监控体系,助力企业在数字化浪潮中稳健前行。
|
27天前
|
缓存 算法 搜索推荐
Java中的算法优化与复杂度分析
在Java开发中,理解和优化算法的时间复杂度和空间复杂度是提升程序性能的关键。通过合理选择数据结构、避免重复计算、应用分治法等策略,可以显著提高算法效率。在实际开发中,应该根据具体需求和场景,选择合适的优化方法,从而编写出高效、可靠的代码。
35 6
|
2月前
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
|
2月前
|
jenkins Java 测试技术
如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例详细说明
本文介绍了如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例,详细说明了从 Jenkins 安装配置到自动构建、测试和部署的全流程。文中还提供了一个 Jenkinsfile 示例,并分享了实践经验,强调了版本控制、自动化测试等关键点的重要性。
96 3
|
2月前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
77 2

热门文章

最新文章