二叉树的练习题(上)

1. 前序遍历

题目解析:

题目:

. - 力扣(LeetCode)

解题步骤:

题目给定的返回值是一个链表,也就是我们每一次前序遍历都要把遍历结果保存到顺序表里面进行返回.

前序遍历: 根结点 -> 左子树 -> 右子树

我们的遍历过程如图

就相当于所有的结点 = 根结点 + 所有的左子树根结点 + 所有的右子树根结点

我们就此拆分问题,每次递归我们都把结点放进顺序表,当我们把每一棵子树的根结点和树的根结点都加入到链表中,就完成了.

但是我们的上述过程没有很好的利用我们的返回值.

我们来优化一下,我们把每次的顺序表返回值给利用起来,整个二叉树的顺序表 = 所有左子树的小链表 + 所有右子树的小链表.

具体代码:

1> 定义全局顺序表,遍历一个加入一个

 List<Integer> list1 = new ArrayList<>();public List<Integer> preorderTraversal(TreeNode root) {//先判断根结点为不为空if (root == null) {return list1;}//不为空就把根结点加入顺序表list1.add((int) root.val);//遍历根结点的左子树preorderTraversal(root.left);//遍历根结点的右子树preorderTraversal(root.right);return list1;//如何合理利用返回值?}

2> 定局部顺序表,利用方法返回值

public List<Integer> preorderTraversal2(TreeNode root) {List<Integer> list = new ArrayList<>();//先判断根结点为不为空if (root == null) {return list;}//不为空就按照根左右的方式来打印;list.add((int) root.val);//遍历根结点的左子树List<Integer> leftTree =  preorderTraversal2(root.left);//把左边的树放进去list.addAll(leftTree);//遍历根结点的右子树List<Integer> rightTree = preorderTraversal2(root.right);//把右边的树放进去list.addAll(rightTree);return list;}

2. 中序遍历

题目解析:

题目

. - 力扣(LeetCode)

步骤: 我们同上述前序遍历

中序遍历: 左子树 -> 根结点 -> 右子树

我们也用俩种方法:第一种每次遍历到左子树就先把左子树的根结点先加入,加完左子树后再加根结点,最后再加入右子树.第二种方法就是利用返回值,我们把先把左子树的顺序表加入,然后我们再加入根结点的顺序表,最后加入右子树的顺序表

具体代码:

1> 使用全局顺序表,采用中序遍历顺序加入结点

 List<Integer> list = new ArrayList<>();public List<Integer> inorderTraversal(TreeNode root) {if (root == null) {return list;}inorderTraversal(root.left);list.add((int)root.val);inorderTraversal(root.right);return list;}

2> 使用局部顺序表,先加入左子树的顺序表,再加入根结点,最后加入右子树的顺序表(充分利用返回值)

//使用返回值public List<Integer> inorderTraversal2(TreeNode root) {List<Integer> subList = new ArrayList<>();if (root == null) {return subList;}//先把左子树加进去List<Integer> listLeft = inorderTraversal(root.left);subList.addAll(listLeft);//再把根结点加进去subList.add((int)root.val);//最后把右子树加进去List<Integer> listRight = inorderTraversal(root.right);subList.addAll(listRight);return subList;}

3. 后序遍历

题目解析:

题目:

145. 二叉树的后序遍历 - 力扣(LeetCode)

步骤:

后序遍历: 左子树 -> 右子树 -> 根结点

我们就按照这个遍历方式加入结点或者顺序表即可

具体代码:

1> 使用全局顺序表,按照后续遍历的顺序,把左右子树的根结点先放入顺序表,最后再把根结点放入

    List<Integer> list2 = new ArrayList<>();public List<Integer> postorderTraversal(TreeNode root) {if(root == null) {return list2;}postorderTraversal(root.left);postorderTraversal(root.right);list2.add((int)root.val);return list2;}

2> 使用局部顺序表,先把左右顺序表加进去,最后加入根

    public List<Integer> postorderTraversal1(TreeNode root) {List<Integer> subList = new ArrayList<>();if(root == null) {return subList;}List<Integer> leftList = postorderTraversal(root.left);subList.addAll(leftList);List<Integer> rightList = postorderTraversal(root.right);subList.addAll(rightList);subList.add((int)root.val);return subList;}

4. 检查俩颗树是否相同

题目:

. - 力扣(LeetCode)

题目解析:

我们判断俩棵树是不是相等,我们就需要判断俩个点:

1. 这俩颗树的结构相同

2. 这俩颗树的每一个结点的值相同

因此我们在前序遍历的基础上,我们分别判断上述条件即可

具体代码:

   public boolean isSameTree(TreeNode p, TreeNode q) {//我们同样通过遍历来完成: 结构 + 值//如果一个二叉树为空,另一个不为空,那么直接返回false,if((p == null && q != null) || (p != null && q == null)) {return false;}//如果都为空if(p == null && q == null){return true;}//先判断根结点是不是一样的if(p.val != q.val) {return false;}//此时我们的俩个结点在这一刻是根结点的值一样,且不为空//我们再判断左子树return isSameTree(p.left,q.left) &&isSameTree(p.right,q.right);}

5. 另一颗树的子树

题目解析:

 题目:

. - 力扣(LeetCode)

我们判断一棵树是不是另一棵树的子树,只需要看俩个地方

1. 俩颗树是否完全一样

2. 一棵树是另一颗子树

俩颗树完全相同题目4已经写了方法,我们直接调用即可

主要是判断2

这个我们有俩个需要注意的点:

1> if(root == null || subRoot == null) 这个是防止空指针异常的条件,我们解释如下

2. 关于里面的遍历操作我们为什么不用isSame要用isSub

具体代码:

public boolean isSameTree(TreeNode p, TreeNode q) {//判断头节点是不是一边是空的if((p == null && q != null) ||(p != null && q == null)) {return false;}//如果全是空的,那么结构一样if(p == null && q == null) {return true;}//如果都不为空,那么我们判断值是否一样if(p.val != q.val) {return false;}//判断左子树和右子树是不是一样的return isSameTree(p.left,q.left) &&isSameTree(p.right,q.right);}//TODO 相同结点的子树//如果俩颗树完全相同,这个是满足的//如果一个树是另一个树的子树,也是满足的(也就是判断是不是左子树或者右子树)//会使用到刚刚的判断俩颗树是否相同的那个代码:isSameTree//时间复杂度:o(n*m)每一个结点判断是不是相同public boolean isSubtree(TreeNode root, TreeNode subRoot) {//防止空指针异常if(root == null || subRoot == null) {return false;}//俩颗树完全一样的情况if(isSameTree(root,subRoot)){return true;}//如果一个是另一个的子树return isSubtree(root.left,subRoot) || isSubtree(root.right,subRoot);}

6. 翻转二叉树

题目解析:

题目:

. - 力扣(LeetCode)

翻转二叉树,意思就是把所有的左子树和右子树进行交换,我们就和下面这么操作即可,首先我们先判断这棵树是不是空,然后我们得到左右子树的地址,然后进行交换即可.

具体代码:

public TreeNode invertTree(TreeNode root) {//先判断是不是空if (root == null) {return root;}//得到左右结点TreeNode rootLeft = invertTree(root.left);TreeNode rootRight = invertTree(root.right);//交换左右结点的地址root.left = rootRight;root.right = rootLeft;return root;}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

LabVIEW高效数据采集与信号处理系统

开发一个基于LabVIEW软件的数据采集与信号处理系统&#xff0c;实现高效的数据采集和信号处理。系统通过优化数据流处理过程和直观的图形化界面&#xff0c;提高了操作效率和数据准确性&#xff0c;特别适合工业和科研应用。 ​ 项目背景 在现代工业和科研领域&#xff0c;数…

ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源 或者超时失效

数据治理过程中&#xff0c;有字段长度不够&#xff0c;扩展字段&#xff0c;报&#xff1a;ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源 或者超时失效 ALTER TABLE LAPD_RSJ_CXJMYLBXCBXX MODIFY HKXZ VARCHAR2(10);错误表示当前会话在试图访问的资源&#xff08;通常…

上海亚商投顾:创业板指冲高回落 全市场成交超2.5万亿

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 市场全天冲高回落&#xff0c;创业板指尾盘跌超1%&#xff0c;北证50一度涨超7%&#xff0c;盘中再创历史新高…

多维视角下的知识管理:Spring Boot应用

2 开发技术 2.1 VUE框架 Vue.js&#xff08;读音 /vjuː/, 类似于 view&#xff09; 是一套构建用户界面的渐进式框架。 Vue 只关注视图层&#xff0c; 采用自底向上增量开发的设计。 Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。 2.2 Mysql数据库 …

x-cmd pkg | gum - 轻松构建美观实用的终端界面,解锁命令行新玩法

目录 简介快速上手安装使用 功能特点竞品和相关作品进一步探索 简介 gum 是由 Charm 团队于 2022 年使用 Go 开发的终端 UI 组件工具箱&#xff0c;能帮用户在终端中快速构建交互式 TUI 界面&#xff08;如表单、菜单、提示框等&#xff09;&#xff0c;简化命令行应用程序的开…

前端学习Day13 CSS盒子的定位(固定定位篇“附练习”)

一、固定定位 固定定位 &#xff08;position:fixed&#xff09;其实是绝对定位的子类别&#xff0c;一个设置了 position:fixed 的元素是相对于视窗固定的&#xff0c;就算页面文档发生了滚动&#xff0c;它也会一直待在相同的地方。 ⚠️&#xff1a;固定定位会脱离文档流。…

基于python多准则决策分析的汽车推荐算法设计与实现

摘要 随着汽车市场的快速发展和消费者需求的多样化&#xff0c;汽车选择变得愈加复杂。为了帮助消费者在众多汽车选项中做出明智的决策&#xff0c;基于多准则决策分析&#xff08;MCDA&#xff09;的汽车推荐算法应运而生。本研究旨在设计和实现一种基于 Python 的汽车推荐系…

基于SpringBoot的“校园交友网站”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“校园交友网站”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 网站首页界面图 用户注册界面图 线下活动界面图 交…

SD-WAN技术怎样与运营商网络无缝集成

随着企业对网络性能和灵活性的要求不断提升&#xff0c;SD-WAN&#xff08;软件定义广域网&#xff09;技术成为优化企业网络架构的重要解决方案。SD-WAN不仅能提升网络的灵活性和可管理性&#xff0c;还能提供更高的性能。要实现SD-WAN的高效部署&#xff0c;必须与运营商的网…

Node.js——fs模块-路径补充说明

1、相对路径&#xff1a; ./座右铭.txt 当前目录下的座右铭.txt座右铭.txt 等效于上面的写法../座右铭.txt 当前目录的上一级目录中的座右铭.txt 2、绝对路径 D&#xff1a;/Program File Windows系统下的绝对路径/usr/bin Linux系统…

SparkSQL的自定义函数

目录 一、关于自定义函数 1、自定义函数分为&#xff1a; 2、pyspark中自定义函数的三种写法&#xff1a; 二、 regeister方式自定义函数&#xff08;SQL和DSL中使用&#xff09; 三、udf注册方式定义UDF函数&#xff08;DSL中使用&#xff09; 一、关于自定义函数 1、自…

实践决定认识

“不登高山&#xff0c;不知天之高也;不临深溪&#xff0c;不知地之厚也。”这句话说明: A.人的意识具有创造性【无关题义】 B.人的认识是独立于实践之外的【错误&#xff0c;实践决定认识】 C.实践在认识过程中具有决定作用【正确】 D.人的一切知识都是从直接经验中获得的 这里…

十一,D O M 获取

1、DOM初相识 1.1、DOM简介 文档对象模型&#xff08;Document Object Model &#xff0c;简称DOM&#xff09;&#xff0c;它就是一些系列编程接口&#xff0c;有了这些接口&#xff0c;就可以改变页面内容&#xff0c;结构和样式 名称描述DOM文档对象模型(Document Object…

SpringBoot04-SpringBoot配置文件

4.Springboot配置文件 4.1配置文件 SpringBoot使用一个全局的配置文件 &#xff0c; 配置文件名称是固定的 application.properties 语法结构 &#xff1a;keyvalue server.port8081application.yaml 语法结构 &#xff1a;key:空格value server:port: 80814.2yaml概述 YAML…

scratch计算台阶 2024年9月scratch四级真题 中国电子学会 图形化编程 scratch四级真题和答案解析

目录 scratch计算台阶 一、题目要求 1、准备工作 2、功能实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 1、思路分析 2、详细过程 四、程序编写 五、考点分析 六、推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 5、p…

什么是量子计算机?

量子计算机是一种利用量子力学原理进行计算的新型计算机。 一、工作原理 传统计算机使用二进制位&#xff08;比特&#xff09;来存储和处理信息&#xff0c;每个比特只能处于 0 或 1 两种状态之一。而量子计算机使用量子比特&#xff0c;量子比特可以同时处于 0 和 1 的叠加…

DevOps业务价值流:需求设计最佳实践

DevOps实践正推动着产品快速迭代与高质量交付&#xff0c;但需求设计作为产品开发的关键起点&#xff0c;往往被忽视。它不仅是收集与分析需求的过程&#xff0c;更是将需求转化为可实施产品特性的核心。本文深入探讨DevOps业务价值流中的需求设计&#xff0c;从调研、整理、原…

科大讯飞离线lunix tts demo使用

项目中需要用到后台服务端用文本生成语音&#xff0c;网上大部分都是通过ai大模型推理出来的&#xff0c;还有写其他方式的&#xff0c;效果和生成时间都比较不理想&#xff0c;但是讯飞生成的只需要零点几秒&#xff0c;不愧是行业NO1&#xff0c;下面说下怎么使用。 1、下载官…

[ DOS 命令基础 ] DOS 命令详解-大集合

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

(61)使用LMS算法估计线性预测器并计算估计误差的MATLAB仿真

文章目录 前言一、仿真说明二、仿真代码三、仿真结果1.LMS自适应滤波器权向量更新曲线2.LMS自适应滤波器算法学习曲线3.期望信号与LMS自适应滤波器输出信号 前言 本文介绍了LMS自适应滤波器对线性预测器系统权系数的估计&#xff0c;进行100次独立实验&#xff0c;计算平均估计…