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

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

【刷题日记】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. 根据二叉树创建字符串

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

欢迎点赞,关注,收藏

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

好了,本次就到这里

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

我是小魔童哪吒,欢迎点赞关注收藏,下次见~

おすすめ

転載: juejin.im/post/7076725688866177054
おすすめ