【刷题日记】606. 根据二叉树创建字符串

简介: 本次刷题日记的第 7 篇,力扣题为:606. 根据二叉树创建字符串 ,简单

【刷题日记】606. 根据二叉树创建字符串

本次刷题日记的第 7 篇,力扣题为:606. 根据二叉树创建字符串简单

一、题目描述:

image.png

朋友们,看到这个题什么什么感觉?

又是一个二叉树的题,本次要使用前序遍历,来遍历这一棵树,且本次的树是二叉树

看了一下题目,只是在之前的树的题目上多加了一部分添加括号的逻辑而已,不会有啥特别的骚操作

二、思路分析:

1、这道题考察了什么思想?你的思路是什么?

查看这个题,我们可以来分析一下,这个题需要考虑哪些情况呢?

  • 这个棵树是二叉树,且需要我们用前序遍历的方式来处理,前序遍历的遍历顺序是 根左右 , 先遍历根节点,再遍历左节点,最后遍历右节点,相信这个 xdm 已经很熟悉了
  • 在我们遍历树的过程中,整个树的根不需要加括号,但是其他的子树涉及的每一个节点都是需要加括号的
  • 对于添加括号,我们还需要明确,子树的右子为空的时候,我们是可以忽略括号的,因为他不影响字符串与原始二叉树之间的一对一映射关系
    例如二叉树遍历结果1(2(4))(3) 我们就知道 4 是 2 的左子树,2 是 1 的左子树,3 是 1 的右子树 ,我们就不需要写成 1(2(4)())(3)
  • 如果子树中,左子是空,右子是有值的,那么 左子的这个空括号是不能省略的,如果省略了,那么就会影响字符串和原始二叉树的一一映射关系
    例如二叉树遍历结果1(2()(4))(3)  , 我们就知道 4 是 2 的右子树,如果去掉了 2 后面的括号,则表达的意思是  4 是 2 的左子树了,这样就不符合题意了

根据以上情况,我们可以来画个简图来用示例推理一下:

例如,示例 1 :二叉树: [1,2,3,4]

image.png

通过上图,我们可以知道,分别以 1 2 4 3 为根节点遍历的时候,我们可以根据如上的分析的规则来进行做括号的增添,大体逻辑是这样的:

  • 如果该节点没有子树,则直接将本身的值加入到结果集
  • 如果该节点左子为空,右子有值,那么左子的空括号要画,右子有值,那么括号也要画上
  • 如果节点的左子有值,右子也有值,那么左右子的括号都要画
  • 如果节点的左子有值,右子为空则画左子的括号,右子的括号需要省略

2、尝试编码

根据上述的逻辑和推演,其实思想很简单,就是根据遍历到的每一个节点,去做如上逻辑的校验即可,按照逻辑来添加括号即可

编码如下:

func tree2str(root *TreeNode) string {
    switch {
    case root == nil:
        return ""
    case root.Left == nil && root.Right == nil:
        return strconv.Itoa(root.Val)
    case root.Right == nil:
        return fmt.Sprintf("%d(%s)", root.Val, tree2str(root.Left))
    default:
        return fmt.Sprintf("%d(%s)(%s)", root.Val, tree2str(root.Left), tree2str(root.Right))
    }
}

可以看出,我们的代码**,就是将上述我们的思想翻译过来而已**,所以,我们做题的时候,需要先想清楚,弄明白整个流程和思路,那么编码的时候,那就是一个翻译的过程,重点是思想

四、总结:

本题的时间复杂度和空间复杂度都是 O(n) ,主要是需要考虑到每一个种情况之后,这个题就很快实现了

原题地址:606. 根据二叉树创建字符串

今天就到这里,学习所得,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

image.png

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~

相关文章
|
7月前
|
开发工具 开发者 iOS开发
testflight上架ipa包-只有ipa包的情况下如何修改签名信息为苹果开发者账户对应的信息-ipa苹果包如何手动改签或者第三方工具改签-优雅草卓伊凡
testflight上架ipa包-只有ipa包的情况下如何修改签名信息为苹果开发者账户对应的信息-ipa苹果包如何手动改签或者第三方工具改签-优雅草卓伊凡
187 20
|
Prometheus Cloud Native 算法
alertmanager集群莫名发送resolve消息的问题探究
alertmanager集群莫名发送resolve消息的问题探究
286 3
|
9月前
|
机器学习/深度学习 存储 并行计算
《探秘Hogwild!算法:无锁并行SGD的神奇之路》
Hogwild!算法是一种实现无锁并行随机梯度下降(SGD)的创新方法,广泛应用于深度学习和大规模数据处理。它通过数据并行架构、无锁更新策略和异步更新机制,允许多个计算节点同时更新共享模型参数,无需等待或同步。这不仅减少了通信开销,提高了资源利用率,还简化了实现和扩展。Hogwild!在图像识别、语音识别等任务中显著加速了模型训练,推动了人工智能技术的发展。
130 5
|
数据采集 机器学习/深度学习 数据挖掘
Python基于波动率模型(ARCH和GARCH)进行股票数据分析项目实战
Python基于波动率模型(ARCH和GARCH)进行股票数据分析项目实战
|
前端开发 JavaScript 程序员
程序员教你用代码制作圣诞树,正好圣诞节拿去送给女神给她个惊喜
使用HTML、CSS和JavaScript实现了一个圣诞树效果,包括一个闪烁的圣诞树和一个动态的光斑。代码包含一个<div>元素作为遮罩,一个<canvas>元素绘制星星动画,以及一个SVG元素绘制圣诞树。页面还包含一个提示用户先点赞再观看的提示。此效果适用于任何浏览器,推荐使用谷歌浏览器。提供了一段HTML代码,可以直接复制粘贴到文件中并以.html格式打开查看效果。
436 0
|
存储 程序员 索引
列表都有哪些自定义方法,它们是怎么实现的?
列表都有哪些自定义方法,它们是怎么实现的?
123 9
|
机器学习/深度学习 人工智能 物联网
快速玩转 Llama2 机器学习 PAI 最佳实践(一)低代码 Lora 微调及部署
采用阿里云机器学习平台PAI-快速开始模块针对 Llama-2-7b-chat 进行开发。PAI-快速开始支持基于开源模型的低代码训练、布署和推理全流程,适合想要快速开箱体验预训练模型的开发者。
69505 59
|
安全 Java 编译器
深入理解Java语言中的方法重载(Overloading)
深入理解Java语言中的方法重载(Overloading)
570 1
|
分布式计算 并行计算 算法
【高并发】什么是ForkJoin?看这一篇就够了!
在JDK中,提供了这样一种功能:它能够将复杂的逻辑拆分成一个个简单的逻辑来并行执行,待每个并行执行的逻辑执行完成后,再将各个结果进行汇总,得出最终的结果数据。有点像Hadoop中的MapReduce。 ForkJoin是由JDK1.7之后提供的多线程并发处理框架。ForkJoin框架的基本思想是分而治之。什么是分而治之?分而治之就是将一个复杂的计算,按照设定的阈值分解成多个计算,然后将各个计算结果进行汇总。相应的,ForkJoin将复杂的计算当做一个任务,而分解的多个计算则是当做一个个子任务来并行执行。
6992 0
【高并发】什么是ForkJoin?看这一篇就够了!