news 2026/6/13 22:11:55

【码道初阶】【Leetcode606】二叉树转字符串:前序遍历 + 括号精简规则,一次递归搞定

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【码道初阶】【Leetcode606】二叉树转字符串:前序遍历 + 括号精简规则,一次递归搞定

【Leetcode606】二叉树转字符串:前序遍历 + 括号精简规则,一次递归搞定

题目要求把一棵二叉树转成字符串,形式类似:

  • 节点值直接输出
  • 左子树用(left)包起来
  • 右子树用(right)包起来
  • 空节点一般用()表示
  • 但要省略所有不影响一一映射的空括号

这句话很关键:

“省略不影响一一映射关系的空括号”
意味着:省略不能让结构变得模糊。


1)先把规则讲明白(这是整题的灵魂)

对于一个节点root

情况 A:有左子树

输出:root(left...)

  • 左子树的括号不能省略,因为它告诉读者“左边有东西”。

情况 B:没有左子树,但有右子树

输出:root()(right...)

  • 这里左边必须输出()
    因为如果省掉(),例如写成root(right...),读者会误以为右子树其实是左子树,结构就对不上了。
    这就是示例 2 的核心原因。

情况 C:没有右子树

  • 右子树这一对括号可以省略(因为右边啥都没有,省了不会产生歧义)。

总结成一句口诀:

右子树存在而左子树不存在时,左边的空括号必须保留;除此之外,能省则省。


2)整体解题思路(递归前序遍历)

用前序遍历(根→左→右)去拼字符串:

  1. 访问当前节点:拼接root.val

  2. 处理左子树括号:

    • 左不空:拼(+ 左子树 +)
    • 左空但右不空:拼()
  3. 处理右子树括号:

    • 右不空:拼(+ 右子树 +)
    • 右空:不拼(直接省略)

为了高效拼字符串,用StringBuilder,避免大量字符串相加造成性能浪费。


3)来看这段代码(整体结构)

classSolution{publicStringtree2str(TreeNoderoot){StringBuilderstringbuilder=newStringBuilder();tree2strchild(root,stringbuilder);returnstringbuilder.toString();}publicvoidtree2strchild(TreeNoderoot,StringBuilderstringbuilder){if(root==null)return;stringbuilder.append(root.val);if(root.left!=null){stringbuilder.append("(");tree2strchild(root.left,stringbuilder);stringbuilder.append(")");}else{if(root.right==null)return;stringbuilder.append("()");}if(root.right!=null){stringbuilder.append("(");tree2strchild(root.right,stringbuilder);stringbuilder.append(")");}else{return;}}}

这份实现是典型的“在递归时直接把括号拼出来”,没有额外数组、栈,空间开销只有递归深度。


4)逐步拆解代码逻辑(每一段在干嘛)

4.1 递归出口:空节点直接返回

if(root==null)return;

空节点不输出任何字符。注意题目里说“空节点用 () 表示”,但那是“表示空孩子”的概念,并不是说碰到 null 就无脑输出()——是否输出()取决于父节点规则(尤其是“左空右不空”的场景)。

4.2 先输出当前节点值(前序的“根”)

stringbuilder.append(root.val);

这一步就是“根”。


4.3 处理左子树(左括号是否要输出)

if(root.left!=null){stringbuilder.append("(");tree2strchild(root.left,stringbuilder);stringbuilder.append(")");}else{if(root.right==null)return;stringbuilder.append("()");}

分两类情况:

左子树存在

输出:(left...)

也就是:

  • 先拼(
  • 递归拼左子树内容
  • 再拼)
左子树不存在

这里又分两种:

  • 如果右子树也不存在:直接return

    • 因为左右都空,当前节点已经输出完了,不需要额外括号
  • 如果右子树存在:必须输出()

    • 这是保留“一一映射”的关键:告诉读者“左边是空的,右边才有东西”

这段代码准确实现了规则 B 和规则 C。


4.4 处理右子树(右括号是否要输出)

if(root.right!=null){stringbuilder.append("(");tree2strchild(root.right,stringbuilder);stringbuilder.append(")");}else{return;}

右子树存在就输出(right...);不存在直接省略(return 结束当前节点处理)。


5)用示例走一遍:为什么会输出正确结果?

示例 1:root = [1,2,3,4]

结构是:

1 / \ 2 3 / 4

递归过程(按拼接顺序):

  • 访问 1:输出1

  • 左存在:输出( ... )

    • 访问 2:输出2

    • 左存在:输出( ... )

      • 访问 4:输出4
      • 4 左空右空:直接结束,不加括号
    • 2 右空:省略

  • 右存在:输出( ... )

    • 访问 3:输出3
    • 3 左空右空:结束

最终:1(2(4))(3)


示例 2:root = [1,2,3,null,4]

1 / \ 2 3 \ 4

关键节点是 2:

  • 2 左空,但右不空(有 4)
  • 必须输出2()(4)

如果省略(),会变成2(4),读者会理解成“4 是 2 的左孩子”,结构就错了。

这就是题目强调“一对一映射”时()必须保留的唯一典型场景


6)复杂度分析

  • 时间复杂度:O(n)
    每个节点访问一次,拼接一次(括号是常数次追加)
  • 空间复杂度:O(h)
    递归栈深度,h为树高;极端退化链表时最坏O(n)

7)易错点重点提醒(写这题最常翻车的地方)

  1. 不是所有 null 都输出()
    ()是由父节点决定是否需要表达空左孩子的。

  2. “左空右不空”时必须输出()
    否则结构信息丢失,无法保持一一映射。

  3. 字符串拼接别用+反复连
    这题节点最多 10^4,用StringBuilder是更稳的选择。


8)小结

这题的正确解法可以概括为一句话:

前序遍历输出节点值,左右子树用括号包裹;只有在“左空右不空”时必须补(),其余空括号能省则省。

把这个规则记牢,代码就会写得非常顺,且不容易漏掉示例 2 这种“最爱卡人”的用例。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/14 0:27:03

CFR Java反编译深度实战:5个高级技巧解锁字节码分析新维度

CFR Java反编译深度实战:5个高级技巧解锁字节码分析新维度 【免费下载链接】cfr This is the public repository for the CFR Java decompiler 项目地址: https://gitcode.com/gh_mirrors/cf/cfr 在当今复杂的Java开发环境中,字节码分析和反编译技…

作者头像 李华
网站建设 2026/6/12 12:40:00

Heroicons新图标终极指南:23个实用SVG图标完全解析

Heroicons新图标终极指南:23个实用SVG图标完全解析 【免费下载链接】heroicons A set of free MIT-licensed high-quality SVG icons for UI development. 项目地址: https://gitcode.com/gh_mirrors/he/heroicons Heroicons新图标库为前端开发工具带来了23个…

作者头像 李华
网站建设 2026/6/12 14:40:48

中达瑞和参与《水果分级标准 猕猴桃》团标制定,以高光谱技术引领水果品质分级新时代

近日,由深圳市农业产业化龙头企业协会发布的团体标准 《T/SZNB 028-2025 水果分级标准 猕猴桃》 正式实施。作为该标准的起草单位之一,中达瑞和 凭借在高光谱与多光谱成像技术领域的深厚积累,为猕猴桃的科学分级与品质提升提供了关键技术支撑…

作者头像 李华
网站建设 2026/6/11 17:48:43

告别微信效率困境:3大智能功能重塑你的工作流

告别微信效率困境:3大智能功能重塑你的工作流 【免费下载链接】WeChatPlugin 微信小助手 项目地址: https://gitcode.com/gh_mirrors/we/WeChatPlugin 在当今快节奏的职场环境中,微信已从单纯的社交工具演变为核心的工作平台。然而,大…

作者头像 李华
网站建设 2026/6/14 5:39:49

C 语言排序算法全解析:从原理到实战,附性能对比

排序是计算机科学中最基础且核心的操作之一,它通过特定规则将无序数据转化为有序序列,广泛应用于购物筛选、数据统计、院校排名等实际场景。在 C 语言中,排序算法的实现直接影响程序的执行效率,不同场景下选择合适的排序算法能显著…

作者头像 李华
网站建设 2026/6/13 5:51:02

Springboot考研自习室预约管理系统1wdeuxh6(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。

一、系统程序文件列表二、开题报告内容基于Spring Boot的考研自习室预约管理系统开题报告一、研究背景与意义1.1 研究背景随着考研人数的逐年攀升,高校及社会自习室座位资源紧张问题日益凸显,“占座难、抢座乱”现象频发。传统自习室管理依赖人工登记&am…

作者头像 李华