当前位置: 首页 > news >正文

【leetcode】根据二叉树创建字符串、二叉树的前中后遍历(非递归链表实现二叉树)

Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~
🌱🌱个人主页:奋斗的明志
🌱🌱所属专栏:数据结构、LeetCode专栏

在这里插入图片描述

📚本系列文章为个人学习笔记,在这里撰写成文一为巩固知识,二为展示我的学习过程及理解。文笔、排版拙劣,望见谅。

在这里插入图片描述

`

力扣练习题

  • 一、根据二叉树创建字符串
    • 1.题目
    • 2.解析
    • 3.完整代码(深度优先遍历)
    • 4.复杂度分析
  • 二、二叉树的前序遍历(非递归)
    • 1.题目
    • 2.解析
    • 3.完整代码
  • 三、二叉树的中序遍历(非递归)
    • 1.题目
    • 2.解析
    • 3.完整代码
  • 四、二叉树的后序遍历(非递归)
    • 1.题目
    • 2.解析
    • 3.完整代码
  • 总结


一、根据二叉树创建字符串

606.根据二叉树创建字符串


1.题目


在这里插入图片描述
在这里插入图片描述


2.解析

利用前序遍历在递归的同时,有四种情况如下:

【第一、二种】

  • 如果当前节点有两个孩子,那我们在递归时,需要在两个孩子的结果外都加上一层括号;
  • 如果当前节点没有孩子,那我们不需要在节点后面加上任何括号;(在本题可以省略)

在这里插入图片描述


【第三种】

  • 如果当前节点只有左孩子,那我们在递归时,只需要在左孩子的结果外加上一层括号,而不需要给右孩子加上任何括号;

在这里插入图片描述


【第四种】

  • 如果当前节点只有右孩子,那我们在递归时,需要先加上一层空的括号 ‘()’ 表示左孩子为空,再对右孩子进行递归,并在结果外加上一层括号。

在这里插入图片描述


3.完整代码(深度优先遍历)


/*** 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 String tree2str(TreeNode root) {//创建 StringBuilder 存储字符串StringBuilder sbu = new StringBuilder();tree2strChild(root,sbu);return sbu.toString();}public void tree2strChild(TreeNode root, StringBuilder sbu) {//先判断根节点if(root == null){return;}//代码走到这,说明该树不为空//把 结点的值添加sbu.append(root.val);//进行递归//因为题目要求的是前序遍历   根左右//接下来判断左子树//左树可能为空   可能不为空if(root.left != null){//左子树不为空,先添加 一个 左小括号sbu.append("(");//开始递归左树tree2strChild(root.left,sbu);//左树递归完了  加一个右小括号sbu.append(")");}else{if(root.right == null){return;}else{sbu.append("()");}}//接下来判断右子树//右树可能为空   可能不为空if(root.right != null){sbu.append("(");//开始递归右树tree2strChild(root.right,sbu);sbu.append(")");}else{return;}}
}

4.复杂度分析

  • 时间复杂度:O(n),其中 n 是二叉树中的节点数目。

  • 空间复杂度:O(n)。在最坏情况下会递归 n 层。

本题也可以用迭代来实现,需要借助栈进行辅助


二、二叉树的前序遍历(非递归)

144.二叉树的前序遍历

1.题目


在这里插入图片描述


2.解析

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

在这里插入图片描述


在这里插入图片描述


  • 借助栈来辅助完成
  • 使用 while 循环进行迭代,条件是 cur 不为空或者栈 stack 不为空。这保证了在遍历完所有节点后退出循环。
  • 内部的第一个 while 循环用于将当前节点 cur 及其左子节点一直压入栈中,并将节点值 cur.val 添加到 list 中,直到没有左子节点为止。
  • 当没有左子节点时,从栈中弹出栈顶节点 top,并将 cur 设置为 top 的右子节点 top.right。这样在下一轮循环中,就会处理右子树的节点。

3.完整代码


/*** 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) {List<Integer> list = new ArrayList<>();if (root == null) {return list;}// 如果 root 不等于空TreeNode cur = root;// 创建一个栈Stack<TreeNode> stack = new Stack<>();while (cur != null || !stack.isEmpty()) {while (cur != null) {stack.push(cur);list.add(cur.val);cur = cur.left;}// 弹出一个元素 给一个中间变量TreeNode top = stack.pop();// 新的cur = top的rightcur = top.right;}return list;}
}

三、二叉树的中序遍历(非递归)

94.二叉树的中序遍历

1.题目


在这里插入图片描述


2.解析

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

在这里插入图片描述


3.完整代码


/*** 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> inorderTraversal(TreeNode root) {// 用来存储元素List<Integer> list = new ArrayList<>();if (root == null) {return list;}TreeNode cur = root;// 创建一个栈 存放结点 用来维护Stack<TreeNode> stack = new Stack<>();while (cur != null || !stack.isEmpty()) {while (cur != null) {// 先入栈stack.push(cur);cur = cur.left;}// 定义一个临时节点TreeNode top = stack.pop();list.add(top.val);cur = top.right;}return list;}
}

四、二叉树的后序遍历(非递归)

145.二叉树的后序遍历

1.题目


在这里插入图片描述


2.解析


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

在这里插入图片描述


  • 迭代遍历过程
while (cur != null || !stack.isEmpty()) {while (cur != null) {// 将当前节点及其左子节点依次压入栈中stack.push(cur);cur = cur.left;}TreeNode top = stack.peek();if (top.right == null || top.right == prev) {// 如果栈顶节点的右子节点为空或者已经访问过stack.pop();  // 弹出栈顶节点list.add(top.val);  // 将栈顶节点值加入结果列表prev = top;  // 更新 prev 指向已访问过的节点} else {// 否则,处理右子节点cur = top.right;}
}
  • 外层的 while 循环保证在当前节点 cur 不为空或者栈 stack 不为空时继续迭代。
  • 内部的第一个 while 循环将当前节点 cur 及其所有左子节点一直压入栈中,直到没有左子节点。
  • stack.peek() 获取栈顶节点 top,然后检查其右子节点:
    • 如果右子节点为空 top.right == null 或者右子节点已经被访问过 top.right == prev,则表示可以访问当前节点 top,因此将其从栈中弹出,并将节点值 top.val 加入 list 中。
    • 更新 prev 指向当前已经访问过的节点 top。
    • 否则,将 cur 设置为当前节点 top 的右子节点,以便下一轮迭代时处理右子树。

3.完整代码


/*** 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> postorderTraversal(TreeNode root) {List<Integer> list = new ArrayList<>();if (root == null) {return list;}TreeNode cur = root;TreeNode prev = null;Stack<TreeNode> stack = new Stack<>();while (cur != null || !stack.isEmpty()) {while (cur != null) {// 压栈stack.push(cur);cur = cur.left;}TreeNode top = stack.peek();if (top.right == null || top.right == prev) {stack.pop();list.add(top.val);prev = top;} else {cur = top.right;}}return list;}
}

这段代码通过栈实现了二叉树的后序遍历,利用了一个额外的 prev 变量来跟踪已经访问过的节点,从而在处理完右子树后能正确处理根节点。这种方法相较于递归实现更为复杂,但在一些情况下可能更高效。

总结

递归函数我们也可以用迭代的方式实现,两种方式是等价的,区别在于递归的时候隐式地维护了一个栈,而我们在迭代的时候需要显式地将这个栈模拟出来,其他都相同.

在这里插入图片描述

在这里插入图片描述

相关文章:

【leetcode】根据二叉树创建字符串、二叉树的前中后遍历(非递归链表实现二叉树)

Hi~&#xff01;这里是奋斗的明志&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f331;&#x1f331;个人主页&#xff1a;奋斗的明志 &#x1f331;&#x1f331;所属专栏&#xff1a;数据结构、LeetCode专栏 &#x1f4da;本系…...

【RabbitMQ】RabbitMQ交换机概述

一、交换机的类型 RabbitMQ提供了以下四种主要类型的交换机&#xff1a; 直连交换机&#xff08;Direct Exchange&#xff09; 特点&#xff1a;直连交换机是最基本的交换机类型&#xff0c;它根据完全匹配的路由键&#xff08;Routing Key&#xff09;将消息路由到绑定的队列…...

ROS2从入门到精通4-6:路径平滑插件开发案例(以B样条曲线平滑为例)

目录 0 专栏介绍1 ROS2路径平滑器介绍2 平滑器插件编写模板2.1 构造平滑器插件类2.2 注册并导出插件2.3 编译与使用插件 3 基于B样条曲线的路径平滑 0 专栏介绍 本专栏旨在通过对ROS2的系统学习&#xff0c;掌握ROS2底层基本分布式原理&#xff0c;并具有机器人建模和应用ROS2…...

Tensorflow训练视觉模型(CPU)

目录 零、模型下载 一、清理C盘 二、 配置环境 三、运行项目前提操作 &#xff08;1&#xff09;根据自己的项目设置路径。每次激活虚拟环境&#xff08;tensorflow115&#xff09;都得重设一次 &#xff08;2&#xff09;执行setup 这个项目的路径移动了位置也需要重设一…...

从根儿上学习spring 十 之run方法启动第四段(4)

我们接着上一节已经准备开始分析AbstractAutowireCapableBeanFactory#doCreateBean方法&#xff0c;该方法是spring真正开始创建bean实例并初始化bean的入口方法&#xff0c;属于核心逻辑&#xff0c;所以我们新开一节开始分析。 图12 图12-530到536行 这几行的主要就是创建b…...

如果我的发明有修改,需要如何处理?

如果我的发明有修改&#xff0c;需要如何处理&#xff1f;...

java:File与MultipartFile互转

1 概述 当我们在处理文件上传的功能时&#xff0c;通常会使用MultipartFile对象来表示上传的文件数据。然而&#xff0c;有时候我们可能已经有了一个File对象&#xff0c;而不是MultipartFile对象&#xff0c;需要将File对象转换为MultipartFile对象进行进一步处理。 在Java中…...

高级java每日一道面试题-2024年8月04日-web篇-如果客户端禁止cookie能实现session还能用吗?

如果有遗漏,评论区告诉我进行补充 面试官: 如果客户端禁止cookie能实现session还能用吗? 我回答: 当客户端禁用了Cookie时&#xff0c;传统的基于Cookie的Session机制会受到影响&#xff0c;因为Session ID通常是通过Cookie在客户端和服务器之间传递的。然而&#xff0c;尽…...

leetcode 107.二叉树的层序遍||

1.题目要求: 给你二叉树的根节点 root &#xff0c;返回其节点值 自底向上的层序遍历 。 &#xff08;即按从叶子节点所在层到根节点所在的层&#xff0c;逐层从左向右遍历&#xff09;2.此题步骤: 1.先创建好队列&#xff0c;出队和入队函数: //创建队列 typedef struct que…...

C++在网络安全领域的应用

前言&#xff1a; 在当今的数字化时代&#xff0c;网络安全已经成为一个至关重要的领域。随着网络威胁和攻击手段的不断演变&#xff0c;开发高效、安全的系统和工具变得尤为重要。C作为一种功能强大且高性能的编程语言&#xff0c;在网络安全领域发挥着不可替代的作用。本文简…...

Chapter 26 Python魔术方法

欢迎大家订阅【Python从入门到精通】专栏&#xff0c;一起探索Python的无限可能&#xff01; 文章目录 前言一、什么是魔术方法&#xff1f;二、常见的魔术方法① __init__构造方法② __str__字符串方法③ __lt__比较方法④ __le__比较方法⑤ __eq__比较方法 前言 本章将详细讲…...

基于Transformer的语音识别与音频分类

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…...

leetcode数论(1362. 最接近的因数)

前言 经过前期的基础训练以及部分实战练习&#xff0c;粗略掌握了各种题型的解题思路。现阶段开始专项练习。 数论包含最大公约数(>2个数)、最大公约数性质、最小公倍数、区间范围质因素计数(最下间隔)、质因素分解、判断质数、平方根、立方根、互质、同余等等。 描述 给…...

sqli-labs-master less1-less6

目录 通关前必看 1、判断是否存在sql注入以及是字符型还是数值型&#xff1a; 2、各种注入方式以及方法 有回显型&#xff1a; 报错注入&#xff08;只有ok和no的提示以及报错提示&#xff09;&#xff1a; 详细思路&#xff0c;后面的题都可以这样去思考 关卡实操 less…...

力扣287【寻找重复数】

给定一个包含 n 1 个整数的数组 nums &#xff0c;其数字都在 [1, n] 范围内&#xff08;包括 1 和 n&#xff09;&#xff0c;可知至少存在一个重复的整数。 假设 nums 只有 一个重复的整数 &#xff0c;返回 这个重复的数 。 你设计的解决方案必须 不修改 数组 nums 且只用常…...

【2024蓝桥杯/C++/B组/传送阵】

题目 问题代码 #include<bits/stdc.h> using namespace std;const int N 1e610; int n; int porter[N]; int ans; int sign[N]; bool used;void dfs(int now, int cnt) {if(sign[now] && used){ans max(ans, cnt);return;}if(!sign[now]){cnt, sign[now] 1; …...

(四十一)大数据实战——spark的yarn模式生产环境部署

前言 Spark 是一个开源的分布式计算系统。它提供了高效的数据处理能力&#xff0c;支持复杂的数据分析和处理任务&#xff0c;是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。Spark Core&#xff1a;实现了Spark的基本功能&#xff0c;包含任务调度、内存管理、错误…...

【深度学习实战(53)】classification_report()

classification_report()是python在机器学习中常用的输出模型评估报告的方法。 classification_report()函数介绍 classification_report()语法如下&#xff1a;classification_report(          y_true,          y_pred,          labelsNone,  …...

计算机网络基础之网络套接字socket编程(初步认识UDP、TCP协议)

绪论​ “宿命论是那些缺乏意志力的弱者的借口。 ——罗曼&#xff0e;罗兰”&#xff0c;本章是为应用层打基础&#xff0c;因为在写应用层时将直接通过文本和代码的形式来更加可视化的理解网络&#xff0c;本章主要写的是如何使用网络套接字和udp、tcp初步认识。 话不多说安…...

手撕Python!模块、包、库,傻傻分不清?一分钟带你弄明白!

哈喽&#xff0c;各位小伙伴们&#xff01;今天咱们来聊聊Python中的模块、包和库&#xff0c;很多新手小白经常搞混&#xff0c;别担心&#xff0c;看完这篇&#xff0c;保证你一分钟就能搞定&#xff01; 打个比方&#xff1a; 模块 (Module): 就好比是一块块乐高积木&#…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...