双非本科准备秋招(17.1)—— 力扣二叉树

1、257. 二叉树的所有路径

        要求返回根节点到叶子节点的所有路径,这里用前序遍历就好。

        每次递归前,都让字符串s加上当前节点的值和“->”,然后判断是否为叶子节点,如果是的话,说明这条路径是一个答案,因为最后多一个->,所以用substring去掉。

        如果root是null,那么root.left和root.right可能会空指针异常。所以每次递归的时候都要做一下判断。

class Solution {List<String> list = new ArrayList<>();public List<String> binaryTreePaths(TreeNode root) {String s = "";pre(root, s);return list;}public void pre(TreeNode root, String s){s += root.val+"->";if(root.left == null && root.right == null){list.add(s.substring(0, s.length()-2));return;}if(root != null && root.left != null) pre(root.left, s);if(root != null && root.right != null) pre(root.right, s);}}

2、110. 平衡二叉树

        我用的比较好想的方法,直接用非递归的方式前序遍历每个节点,在出栈的时候进行检查,检查每个节点的左右孩子最大高度差是否符合要求。        

class Solution {public boolean isBalanced(TreeNode root) {LinkedList<TreeNode> stack = new LinkedList<>();while(root != null || !stack.isEmpty()){if(root != null){stack.push(root);root = root.left;}else{//检查TreeNode t = stack.pop();if(Math.abs(H(t.left) - H(t.right)) > 1){return false;}root = t.right;}}return true;}public int H(TreeNode root){if(root == null) return 0;return Math.max(H(root.left), H(root.right))+1;}
}

3、222. 完全二叉树的节点个数

        直接遍历即可。

class Solution {public int countNodes(TreeNode root) {LinkedList<TreeNode> stack = new LinkedList<>();int cnt = 0;while(root != null || !stack.isEmpty()){if(root != null){cnt++;stack.push(root);root = root.left;}else{TreeNode t = stack.pop();root = t.right;}}return cnt;}
}

4、105. 从前序与中序遍历序列构造二叉树

        前序:1 2 4 3 6 7

        中序:4 2 1 6 3 7

首先,要确认根节点的值,根节点就是前序遍历的第一个节点。

于是我们得到根:1

然后在中序的数组中找到根,因为中序是 左根右 的顺序,所以根的左右两侧就是左子树

左:4 2

右:6 3 7

同样的,我们遍历左子树4 2,在前序中找到根,得到根是2,于是开始循环······

        观察以上内容,我们可以这样做:找到前序遍历的节点,然后循环遍历中序数组,找到第i个元素是根节点,这时候继续递归寻找左子树,左子树的前序数组下标为1~i,中序数组为0~i-1;右子树的前序数组下标为i+1~len-1,中序数组为i+1~len-1

        因为两个数组长度相同,所以判断退出条件写一个即可。

        当然这样效率比较低,但是确实比较好理解一些。

class Solution {public TreeNode buildTree(int[] preorder, int[] inorder) {return buildByPreAndIn(preorder, inorder);}public TreeNode buildByPreAndIn(int[] pre, int[] in){if(pre.length == 0) return null;//根节点TreeNode root = new TreeNode(pre[0]);for(int i = 0; i < in.length; i++){if(root.val == in[i]){//区分左右子树 in是 0~i-1  i+1 ~ len-1   pre是1 ~ i  i+1 ~ len-1root.left = buildByPreAndIn(Arrays.copyOfRange(pre, 1, i+1), Arrays.copyOfRange(in, 0, i));root.right = buildByPreAndIn(Arrays.copyOfRange(pre, i+1, in.length), Arrays.copyOfRange(in, i+1, in.length));break;}}//每次返回根节点return root;}
}class TreeNode {public int val;public TreeNode left;public TreeNode right;public TreeNode(int val) {this.val = val;}public TreeNode(int val, TreeNode left, TreeNode right) {this.val = val;this.left = left;this.right = right;}
}

5、106. 从中序与后序遍历序列构造二叉树

        跟上一个题区别不大,后序最后一个数就是根节点,也是从中序数组中找到根,然后又分成左右子树······

        我们可以根据前序中序,也可以根据中序后序建树,但是不可以根据前序后序建树,因为前面两个方式,我们都可以通过前序或者后序明确得到根节点,然后根据中序划分左右子树,但是如果只有前序和后序,我们得到根节点之后,无法确定如何划分左右子树。

class Solution {public TreeNode buildTree(int[] inorder, int[] postorder) {return buildByInAndPost(inorder, postorder);}public TreeNode buildByInAndPost(int[] in, int[] post){if(in.length == 0) return null;TreeNode root = new TreeNode(post[post.length - 1]);for(int i = 0; i < in.length; i++){if(in[i] == root.val){root.left = buildByInAndPost(Arrays.copyOfRange(in, 0, i), Arrays.copyOfRange(post, 0, i));root.right = buildByInAndPost(Arrays.copyOfRange(in, i+1, in.length), Arrays.copyOfRange(post, i, post.length-1));break;}}return root;}
}
public class TreeNode {public int val;public TreeNode left;public TreeNode right;public TreeNode(int val) {this.val = val;}public TreeNode(int val, TreeNode left, TreeNode right) {this.val = val;this.left = left;this.right = right;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/668903.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为啥餐饮界营销频频出圈?媒介盒子分享

回看2023年的营销热点&#xff0c;茶饮界和餐饮行业依然占据了最多的出圈镜头&#xff0c;从麦当劳的“麦门”到海底捞的科目三&#xff0c;许多餐饮和食品品牌都依靠营销策划和巧思成功占据了用户心智。毫无疑问&#xff0c;内容已经成为公认的和用户沟通的最佳手段。今天媒介…

Django的配置文件setting.py

BASE_DIR 项目路径&#xff1a;默认是已经打开的主项目路径 ​​​​​​​BASE_DIR os.path.dirname(os.path.dirname(os.path.abspath(__file__))) SECRET_KEY 密钥 SECRET_KEY (dh&_fm2hfn9y)35!_6#$a7q%%^onoy#-a8x18r4(6*8f(aniDEBUG 帮助调试&#xff0c;默认…

【EI会议征稿通知】第三届智能控制与应用技术国际学术会议(AICAT 2024)

第三届智能控制与应用技术国际学术会议&#xff08;AICAT 2024&#xff09; 2024 3rd International Symposium on Artificial Intelligence Control and Application Technology 2024年第三届智能控制与应用技术国际学术会议&#xff08;AICAT 2024&#xff09;定于2024年5月…

Postgresql数据库存储过程中的事务处理

在PostgreSQL中&#xff0c;事务处理是一种保证数据库操作要么完全成功&#xff0c;要么完全失败的机制&#xff0c;确保数据库的完整性和一致性。事务通过一系列的数据库操作组成&#xff0c;这些操作作为一个整体执行&#xff0c;它们要么全部成功&#xff0c;要么全部失败。…

Android14之Selinux报错:unknown type qemu_device at token (一百八十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

C语言:公式求和

题目描述 计算公式&#xff1a;1-1/21/3-1/4……&#xff0c;求前面n(n≤10000)项和&#xff0c;结果保留小数点后面6位。 例如当n4时&#xff0c;和值为0.583333 当n10时&#xff0c;和值为0.645635 输入格式 一个正整数n 输出格式 求出的和值&#xff0c;保留小数点后面6位 …

如何批量删除OneDrive for Business中的文件历史版本

OneDrive for Business是微软提供的云存储服务&#xff0c;它允许用户存储、同步和共享文件。为了保护数据不受意外更改的影响&#xff0c;OneDrive提供了版本控制功能&#xff0c;用户可以查看和恢复文件的旧版本。但是&#xff0c;随着文件数量的增加&#xff0c;这些历史版本…

在bash或脚本中,如何并行执行命令或任务(命令行、parallel、make)

最近要批量解压归档文件和压缩包&#xff0c;所以就想能不能并行执行这些工作。因为tar自身不支持并行解压&#xff0c;但是像make却可以支持生成一些文件&#xff0c;所以我才有了这种想法。 方法有两种&#xff0c;第一种不用安装任何软件或工具&#xff0c;直接bash或其他 …

QXlsx Qt操作excel(2)

QXlsx 是一个用于处理Excel文件的开源C库。它允许你在你的C应用程序中读取和写入Microsoft Excel文件&#xff08;.xlsx格式&#xff09;。该库支持多种操作&#xff0c;包括创建新的工作簿、读取和写入单元格数据、格式化单元格、以及其他与Excel文件相关的功能。 关于QXlsx的…

svg格式图片转png,jpg等(矢量图转像素点阵图)

imagemagick 效果不太理想&#xff0c;有些svg图片&#xff0c;convert会生成灰色空白图片&#xff0c;另外尺寸也不方便控制。虽然可以使用参数 -resize 100x 但是这个是在转换后的像素点图上执行的&#xff0c;因此会让图像变得不清晰。 # svg图片地址为网络地址 curl -s h…

动力电池智能工厂数字孪生可视化,助力新能源汽车产业数字化转型

动力电池智能工厂数字孪生可视化&#xff0c;助力新能源汽车产业数字化转型。随着新能源汽车产业的快速发展&#xff0c;动力电池作为新能源汽车的核心组成部分&#xff0c;其生产制造的数字化转型也成为了行业关注的焦点。动力电池智能工厂数字孪生可视化平台作为一种新型的技…

GitLag所有操作-汇总

1、MAC Git环境设置 跳转 Git通过Token拉代码&#xff1a; 跳转 Git基础操作&#xff1a;拉、put、删 跳转 Git回滚操作&#xff1a; 跳转 Git回滚操作-复杂 跳转 对于Commit但是还没有push的代码&#xff0c;如果回滚&#xff1a; 跳转

Python中的HTTP代理服务器和客户端的区别与联系

在Python编程中&#xff0c;当我们涉及到网络通信&#xff0c;尤其是HTTP请求时&#xff0c;经常会听到“HTTP代理服务器”和“客户端”这两个词。它们在网络世界中扮演着不同的角色&#xff0c;但又有着紧密的联系。 区别 首先&#xff0c;我们来谈谈它们的区别。 HTTP代理…

阿里云服务器多少钱一年?4核16G10M带宽26元/月

2024年2月阿里云服务器租用价格表更新&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年、ECS u1实例2核4G、5M固定带宽、80G ESSD Entry盘优惠价格199元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元、2核4G4M带宽轻量服务器一年165元12个月、2核…

vue基本语法总结大全

vue基本语法 文章目录 vue基本语法基本用法内容渲染指令属性绑定指令使用js表达式事件绑定指令条件渲染指令v-else和v-else-if指令列表渲染指令v-for中的key 组件化开发安装详细讲解 第三方组件1. 组件间的传值2. element-ui介绍3. 组件的使用4. 图标的使用 Axios网络请求1. Ax…

15:矩阵按键

矩阵按键 1、 矩阵按键的原理图分析2、 矩阵键盘的工作过程3、编程实战3.1、先通过LED灯进行按键测试3.2、通过静态数码管显示键值 1、 矩阵按键的原理图分析 (1)横向和纵向分割 (2)按键两端分别接不同的IO引脚 (3)按键的物理作用不变&#xff1a;按下接通电路&#xff0c;弹起…

Skywalking9.x简单安装和配置Java探针采集数据

问题描述 需要使用Skywalking获取Java程序的各个链路之间的调用关系&#xff0c;简单部署了一个Skywalking&#xff0c;对过程进行简单记录。 开始 下载skywalking安装包和java探针安装包,本次下载的是skywalkingv9.2.0,java探针是9.1.0版本. https://skywalking.apache.or…

ArcGIS Pro 按照字段进行融合或拆分

ArcGIS Pro 按字段融合 在ArcGIS Pro中&#xff0c;通过使用“融合”工具可以轻松地合并具有相同字段的图层。 步骤一&#xff1a;打开ArcGIS Pro 启动ArcGIS Pro应用程序&#xff0c;确保您已经登录并打开您的项目。 步骤二&#xff1a;添加图层 将包含相同字段的图层添加到…

06-Java适配器模式 ( Adapter Pattern )

原型模式 摘要实现范例 适配器模式&#xff08;Adapter Pattern&#xff09;是作为两个不兼容的接口之间的桥梁 适配器模式涉及到一个单一的类&#xff0c;该类负责加入独立的或不兼容的接口功能 举个真实的例子&#xff0c;读卡器是作为内存卡和笔记本之间的适配器。您将内…

CodeMeter强化了ETM WinCC 开放架构平台的许可与安全保护

在面对日益复杂的网络安全威胁时&#xff0c;ETM professional control采取了前瞻性的措施&#xff0c;选择了业界领先的威步CodeMeter技术&#xff0c;以保护其标志性的WinCC开放架构平台。这一选择不仅体现了ETM对安全的高度重视&#xff0c;也标志着其在保障关键基础设施运营…