【刷题日记】606. 根据二叉树创建字符串
本次刷题日记的第 7 篇,力扣题为:606. 根据二叉树创建字符串 ,简单
一、题目描述:
朋友们,看到这个题什么什么感觉?
又是一个二叉树的题,本次要使用前序遍历,来遍历这一棵树,且本次的树是二叉树
看了一下题目,只是在之前的树的题目上多加了一部分添加括号的逻辑而已,不会有啥特别的骚操作
二、思路分析:
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]
通过上图,我们可以知道,分别以 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. 根据二叉树创建字符串
今天就到这里,学习所得,若有偏差,还请斧正
欢迎点赞,关注,收藏
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力
好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是阿兵云原生,欢迎点赞关注收藏,下次见~