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

本文涉及的产品
对象存储 OSS,标准 - 本地冗余存储 20GB 3个月
对象存储OSS,敏感数据保护2.0 200GB 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; } ```
相关实践学习
通义万相文本绘图与人像美化
本解决方案展示了如何利用自研的通义万相AIGC技术在Web服务中实现先进的图像生成。
目录
相关文章
|
1月前
|
Java 开发工具
【Azure Storage Account】Java Code访问Storage Account File Share的上传和下载代码示例
本文介绍如何使用Java通过azure-storage-file-share SDK实现Azure文件共享的上传下载。包含依赖引入、客户端创建及完整示例代码,助你快速集成Azure File Share功能。
331 4
|
1月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
183 0
|
30天前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
255 35
|
1月前
|
机器学习/深度学习 算法 机器人
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
137 8
|
1月前
|
机器学习/深度学习 算法 自动驾驶
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)
145 8
|
1月前
|
机器学习/深度学习 数据采集 负载均衡
结合多种启发式解码方法的混合多目标进化算法,用于解决带工人约束的混合流水车间调度问题(Matlab代码实现)
结合多种启发式解码方法的混合多目标进化算法,用于解决带工人约束的混合流水车间调度问题(Matlab代码实现)
118 0
|
1月前
|
机器学习/深度学习 人工智能 算法
【基于TTNRBO优化DBN回归预测】基于瞬态三角牛顿-拉夫逊优化算法(TTNRBO)优化深度信念网络(DBN)数据回归预测研究(Matlab代码实现)
【基于TTNRBO优化DBN回归预测】基于瞬态三角牛顿-拉夫逊优化算法(TTNRBO)优化深度信念网络(DBN)数据回归预测研究(Matlab代码实现)
110 0
|
1月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
1月前
|
数据采集 分布式计算 并行计算
mRMR算法实现特征选择-MATLAB
mRMR算法实现特征选择-MATLAB
140 2
|
2月前
|
传感器 机器学习/深度学习 编解码
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
191 3

热门文章

最新文章