【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,搭建一个在线教育视频课程分享网站。
目录
相关文章
|
7天前
|
搜索推荐 Java 索引
|
6天前
|
负载均衡 NoSQL 算法
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
这篇文章是关于Java面试中Redis相关问题的笔记,包括Redis事务实现、集群方案、主从复制原理、CAP和BASE理论以及负载均衡算法和类型。
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
|
7天前
|
搜索推荐 Java 索引
|
1天前
|
数据可视化 Java
使用ChatGPT实现可视化操作扫雷小游戏 【java代码实现】
这篇文章介绍了使用Java语言和Swing框架实现的扫雷小游戏的详细代码和实现过程。
使用ChatGPT实现可视化操作扫雷小游戏 【java代码实现】
|
1天前
|
前端开发 IDE Java
"揭秘前端转Java的秘径:SpringBoot Web极速入门,掌握分层解耦艺术,让你的后端代码飞起来,你敢来挑战吗?"
【8月更文挑战第19天】面向前端开发者介绍Spring Boot后端开发,通过简化Spring应用搭建,快速实现Web应用。本文以创建“Hello World”应用为例,展示项目基本结构与运行方式。进而深入探讨三层架构(Controller、Service、DAO)下的分层解耦概念,通过员工信息管理示例,演示各层如何协作及依赖注入的使用,以此提升代码灵活性与可维护性。
|
3天前
|
Java 开发者
Java中的Lambda表达式:简化你的代码之旅
【8月更文挑战第17天】 在编程的海洋中,简洁是航行的风帆。Lambda表达式,作为Java 8的一大亮点,为开发者提供了一种更为紧凑、易读的编码方式。本篇文章将带你领略Lambda表达式的魅力,从基础概念到实际应用,让你的代码像诗句一样流畅。
13 4
|
1天前
|
设计模式 算法 安全
Java编程中的设计模式:提升代码的可维护性和扩展性
【8月更文挑战第19天】在软件开发的世界里,设计模式是解决常见问题的一种优雅方式。本文将深入探讨Java编程语言中常用的几种设计模式,并解释如何通过这些模式来提高代码的可维护性和扩展性。文章不涉及具体的代码实现,而是侧重于理论和实践相结合的方式,为读者提供一种思考和改善现有项目的新视角。
|
1天前
|
设计模式 Java
常用设计模式介绍~~~ Java实现 【概念+案例+代码】
文章提供了一份常用设计模式的全面介绍,包括创建型模式、结构型模式和行为型模式。每种设计模式都有详细的概念讲解、案例说明、代码实例以及运行截图。作者通过这些模式的介绍,旨在帮助读者更好地理解源码、编写更优雅的代码,并进行系统重构。同时,文章还提供了GitHub上的源码地址,方便读者直接访问和学习。
常用设计模式介绍~~~ Java实现 【概念+案例+代码】
|
1天前
|
Java 开发者
在Java编程的广阔天地中,if-else与switch语句犹如两位老练的舵手,引领着代码的流向,决定着程序的走向。
在Java编程中,if-else与switch语句是条件判断的两大利器。本文通过丰富的示例,深入浅出地解析两者的特点与应用场景。if-else适用于逻辑复杂的判断,而switch则在处理固定选项或多分支选择时更为高效。从逻辑复杂度、可读性到性能考量,我们将帮助你掌握何时选用哪种语句,让你在编程时更加得心应手。无论面对何种挑战,都能找到最适合的解决方案。
6 1
|
7天前
|
搜索推荐 Java