算法训练(leetcode)二刷第十一天 | 144. 二叉树的前序遍历、145. 二叉树的后序遍历、94. 二叉树的中序遍历、102. 二叉树的层序遍历

刷题记录

  • 144. 二叉树的前序遍历
    • 思路一:递归前序遍历
    • 思路二:迭代前序遍历
    • 思路三:统一迭代法
  • 145. 二叉树的后序遍历
    • 思路一:递归后序遍历
    • 思路二:迭代后序遍历
    • 思路三:统一迭代法
  • 94. 二叉树的中序遍历
    • 思路一:递归中序遍历
    • 思路二:迭代中序遍历
    • 思路三:统一迭代法
  • 102. 二叉树的层序遍历

144. 二叉树的前序遍历

leetcode题目地址

思路一:递归前序遍历

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)

// java
/*** Definition for a binary tree node.* 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;*     }* }*/
class Solution {public void preOrder(TreeNode root, List<Integer> res){if(root == null){return;}res.add(root.val);preOrder(root.left, res);preOrder(root.right, res);}public List<Integer> preorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<Integer>();preOrder(root, res);return res;}
}

思路二:迭代前序遍历

Tips: 入栈时先入右节点再入左节点,因为这样在出栈的时候才是先左后右的顺序。

/*** Definition for a binary tree node.* 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;*     }* }*/
class Solution {public List<Integer> preorderTraversal(TreeNode root) {if(root == null) return new ArrayList<Integer>();Stack<TreeNode> st = new Stack<>();List<Integer> res = new ArrayList<Integer>();st.add(root);while(!st.isEmpty()){root = st.pop();res.add(root.val);if(root.right != null) st.push(root.right);if(root.left != null) st.push(root.left);}return res;}
}

思路三:统一迭代法

用null标记待处理节点,遇到null开始处理。

// java
/*** Definition for a binary tree node.* 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;*     }* }*/
class Solution {public void preOrder(TreeNode root, List<Integer> res){Stack<TreeNode> st = new Stack<>();if(root != null) st.push(root);while(!st.isEmpty()){TreeNode node = st.pop();if(node != null){if(node.right != null) st.push(node.right); // 右if(node.left != null) st.push(node.left); // 左st.push(node); // 中 当前结点未处理,放回st.push(null); // 标记}else{ // 空节点 开始处理node = st.pop();res.add(node.val);}}}public List<Integer> preorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<>();preOrder(root, res);return res;}
}

145. 二叉树的后序遍历

leetcode题目地址

思路一:递归后序遍历

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)

// java
/*** Definition for a binary tree node.* 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;*     }* }*/
class Solution {public void postOrder(TreeNode root, List<Integer> res){if(root == null){return;}postOrder(root.left, res);postOrder(root.right, res);res.add(root.val);}public List<Integer> postorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<Integer>();postOrder(root, res);return res;}
}

思路二:迭代后序遍历

Tips: 后序遍历:左右中,前序遍历:中左右。只需要将前序遍历的左右调换一下顺序即为后序遍历的逆序,然后再逆置结果列表即可。

// java
/*** Definition for a binary tree node.* 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;*     }* }*/
class Solution {public void postOrder(TreeNode root, List<Integer> res){if(root == null){return;}Stack<TreeNode> st = new Stack<TreeNode>();st.push(root);while(!st.isEmpty()){root = st.pop();res.add(root.val);if(root.left != null) st.push(root.left);if(root.right != null) st.push(root.right);}Collections.reverse(res);}public List<Integer> postorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<Integer>();postOrder(root, res);return res;}
}

思路三:统一迭代法

// java
/*** Definition for a binary tree node.* 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;*     }* }*/
class Solution {public void postOrder(TreeNode root, List<Integer> res){Stack<TreeNode> st = new Stack<>();if(root != null) st.push(root);while(!st.isEmpty()){TreeNode node = st.pop();if(node != null){st.push(node); // 中 当前结点未处理,放回st.push(null); // 标记if(node.right != null) st.push(node.right); // 右if(node.left != null) st.push(node.left); // 左}else{ // 空节点 开始处理node = st.pop();res.add(node.val);}}}public List<Integer> postorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<>();postOrder(root, res);return res;}
}

94. 二叉树的中序遍历

leetcode题目地址

思路一:递归中序遍历

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)

// java
/*** Definition for a binary tree node.* 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;*     }* }*/
class Solution {public void InOrder(TreeNode root, List<Integer> res){if(root == null){return;}InOrder(root.left, res);res.add(root.val);InOrder(root.right, res);}public List<Integer> inorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<Integer>();InOrder(root, res);return res;}
}

思路二:迭代中序遍历

/*** Definition for a binary tree node.* 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;*     }* }*/
class Solution {public void InOrder(TreeNode root, List<Integer> res){if(root == null){return;}Stack<TreeNode> st = new Stack<TreeNode>();while(!st.isEmpty() || root != null){if(root != null){st.push(root);root = root.left;}else{root = st.pop();res.add(root.val);root = root.right;}}}public List<Integer> inorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<Integer>();InOrder(root, res);return res;}
}

思路三:统一迭代法

//java
/*** Definition for a binary tree node.* 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;*     }* }*/
class Solution {public void inOrder(TreeNode root, List<Integer> res){Stack<TreeNode> st = new Stack<>();if(root != null) st.push(root);while(!st.isEmpty()){TreeNode node = st.pop();if(node != null){if(node.right != null) st.push(node.right); // 右st.push(node); // 中 当前结点未处理,放回st.push(null); // 标记if(node.left != null) st.push(node.left); // 左}else{ // 空节点 开始处理node = st.pop();// 重新从栈内取元素res.add(node.val);}}}public List<Integer> inorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<>();inOrder(root, res);return res;}
}

102. 二叉树的层序遍历

leetcode题目地址

借助队列。记录每一层的节点数,然后每次从队列取size个结点。

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)

// java
/*** Definition for a binary tree node.* 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;*     }* }*/
class Solution {public List<List<Integer>> levelOrder(TreeNode root) {Queue<TreeNode> que = new LinkedList<>();List<List<Integer>> allRes = new ArrayList<>();if(root != null){que.offer(root);} while(!que.isEmpty()){int size = que.size();List<Integer> res = new ArrayList<>();while(size-->0){TreeNode node = que.poll();if(node.left != null) que.offer(node.left);if(node.right != null) que.offer(node.right);res.add(node.val);}allRes.add(res);}return allRes;}
}

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

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

相关文章

OmicsTools软件和R语言分析环境安装配置答疑汇总最新版

OmicsTools软件和R语言分析环境安装配置答疑汇总 前言提示 我开发了一款本地电脑无限使用的零代码生信数据分析作图神器电脑软件OmicsTools&#xff0c;欢迎大家使用进行生物医学科研数据分析和作图&#xff0c;不需要学编程写代码&#xff0c;分析次数没有限制&#xff0c;可…

java web调试时清理当前网址的缓存

java web调试时清理当前网址的缓存 背景 开发后端接口的时候&#xff0c;出现页面已经重新部署启动。但页面报错404的问题。询问前端同学后&#xff0c;发现是因为没有清理页面缓存导致的。特别在此记录。 清理页面缓存 操作方式 chrome浏览器 F12 > 应用 > 存储 &g…

PyTorch的基础教程

以下是PyTorch的基础教程&#xff0c;包括安装步骤以及一个简单的入门Demo。 一、PyTorch安装 安装Anaconda Anaconda是一个流行的Python发行版&#xff0c;包含了大量的科学计算库。访问Anaconda官网&#xff0c;选择适合操作系统的版本进行下载和安装。在安装过程中&#xf…

分布式 ID 生成策略(二)

在上一篇文章&#xff0c;分布式 ID 生成策略&#xff08;一&#xff09;&#xff0c;我们讨论了基于数据库的 ID 池策略&#xff0c;今天来看另一种实现&#xff0c;基于雪花算法的分布式 ID 生成策略。 如图所示&#xff0c;我们用 41 位时间戳 12 位机器 ID 10 位序列号&a…

解决edge浏览器无法同步问题

有时候电脑没带&#xff0c;但是浏览器没有同步很烦恼。chrome浏览器的同步很及时在多设备之间能很好使用。但是edge浏览器同步没反应。 在这里插入图片描述 解决方法&#xff1a; 一、进入edge浏览器点击图像会显示未同步。点击“管理个人资料”&#xff0c;进入后点击同步&…

【机器学习】14. 集成学习 ensemble: bagging, boosting, 随机森林 random forest

集成学习 ensemble: bagging, boosting, 随机森林 random forest 1. Ensemble 整体认知2. 使用Ensemble的原因3. 构建Ensemble 的方法4. Bagging&#xff08;bootstrap aggregation&#xff09;特点 5. BoostingAdaBoost整体算法思路 6. 比较7. 随机森林 1. Ensemble 整体认知 …

记录一次更新idea

一、官网下载安装包&#xff0c;拿所需版本 二、链接下载&#xff0c; 逐行仔细读readme.txt 三、执行script(unstall<->install)vbs、-javaagent:更改时记得

Vue背景图片自适应大屏与小屏

1&#xff0c;父绝子相 效果是台式看的更多&#xff0c;笔记本看部分。但是图片不会变形 <div class"father" style"width:100%; position:relative"> <img src"test.png" class"son" style"width:1920px; position:a…

低代码平台如何通过AI赋能,实现更智能的业务自动化?

引言 随着数字化转型的加速推进&#xff0c;企业在日常运营中面临的业务复杂性与日俱增。如何快速响应市场需求&#xff0c;优化流程&#xff0c;并降低开发成本&#xff0c;成为各行业共同关注的核心问题。低代码平台作为一种能够快速构建应用程序的工具&#xff0c;因其可视化…

实现企业微信打卡月报与简道云的高效集成

实现企业微信打卡月报与简道云的高效集成 企业微信打卡月报同步到简道云 在企业管理中&#xff0c;员工的考勤数据是至关重要的一环。为了实现高效的数据管理和分析&#xff0c;我们需要将企业微信的打卡月报数据集成到简道云平台。本文将分享一个具体的技术案例&#xff0c;展…

【Redis】常见基本全局命令

一、Redis俩大核心命令 由于Redis是以键值对的形式进行数据存取&#xff0c;自然就离不开不断的存储和获取&#xff0c;而其所对应的命令则是set和get&#xff0c;如此说来二者为Redis的核心基础命令也不为过。 作用&#xff1a;用于存储Stirng类型的数据 返回&#xff1a;当…

GPT避坑指南:如何辨别逆向、AZ、OpenAI官转

市面上有些说自己是官转&#xff0c;一刀只需要1块甚至几毛钱&#xff0c;并声称官方倍率的&#xff0c;很大可能就是使用的是 逆向或Azure。 如何鉴别逆向 逆向的种类很多&#xff0c;主要分为3类 逆向不知名A| 镜像站或偷的 key。成本约等于0&#xff0c;调用聊天数据可能在…

第十一章 Shiro会话管理和加密

学习目标 11.1 会话管理11.1.1 会话相关API一、获取会话二、会话属性管理三、会话信息获取四、会话控制五、会话监听六、会话DAO七、会话验证 11.2 缓存一、缓存接口二、内置缓存实现三、配置缓存四、使用缓存五、缓存清理六、注意事项 前面两章我们已经掌握了Shiro四大基石的认…

frida脚本,自动化寻址JNI方法

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 1. 通过 ArtMethod 结构体找到 jni 方法在内存中的地址&#xff0c;并把寻址方法通过 rpc.exports 暴露给 Python 脚本调用 jni_addr.js let entry_point_fr…

【PnP】详细公式推导,使用DLT直接线性变换法求解相机外参

文章目录 &#x1f680;PnP1️⃣ 求解不考虑尺度的解2️⃣ 恢复解的尺度3️⃣ 另一种解法 &#x1f680;PnP PnP(Perspective-n-Point)是求解3D到2D点相机外参的算法。PnP算法有DLT直接线性变换、P3P三对点估计位姿、EPnP(Efficient PnP)、BA(Bundle Adjustment)光速法平差。这…

数据库基础介绍

前言&#xff1a; 在当今信息化、数字化的时代&#xff0c;数据库是支撑一切信息系统的核心基础设施。无论是金融机构的账户管理、电商平台的商品库存&#xff0c;还是社交媒体的用户信息&#xff0c;数据库都在背后扮演着关键角色数据库不仅用于存储和管理数据&#xff0c;更…

[Ansible实践笔记]自动化运维工具Ansible(一):初探ansibleansible的点对点模式

文章目录 Ansible介绍核心组件任务执行方式 实验前的准备更新拓展安装包仓库在ansible主机上配置ip与主机名的对应关系生成密钥对将公钥发送到被管理端&#xff0c;实现免密登录测试一下是否实现免密登录 常用工具ansibleansible—docansible—playbook 主要配置文件 Ansible 模…

倪师学习笔记-天纪-易经八卦

一、简介 卦代表事情&#xff0c;爻代表时机&#xff0c;三爻为一卦八卦对应的天相&#xff0c;六十四卦对应人间事 二、八卦性 1、乾 天父亲向下看&#xff0c;无所求&#xff0c;雄心万丈始终如一&#xff0c;贞&#xff0c;坚心&#xff0c;专心至刚&#xff0c;天威&am…

Hash表算法

哈希表 理论知识&#xff08;本文来自于代码随想录摘抄&#xff09;什么是哈希常见的三种哈希结数组&#xff1a;set:map:其他常用方法或者技巧&#xff08;自己总结的&#xff09; 练习题和讲解有效的字母移位词349. 两个数组的交集1. 两数之和454. 四数相加 II15. 三数之和 总…

如何选择适合自己的 Python IDE

集成开发环境&#xff08;IDE&#xff09;是指提供广泛软件开发能力的软件应用程序。IDE 通常包括源代码编辑器、构建自动化工具和调试器。大多数现代 IDE 都配备了智能代码补全功能。在本文中&#xff0c;你将发现目前市场上最好的 Python IDE。 什么是 IDE&#xff1f; IDE…