【LeetCode经典题解】:二叉树转字符串递归解法的核心逻辑与代码解剖

🎁个人主页:User_芊芊君子

🎉欢迎大家点赞👍评论📝收藏⭐文章

🔍系列专栏:Java.数据结构


【前言】

在二叉树的算法问题中,将二叉树结构转化为特定格式的字符串是经典的基础题型,这一问题不仅考察对二叉树遍历的理解,更考验对递归逻辑和边界条件的处理能力。本文将围绕 tree2str 问题展开,通过逐行拆解代码的方式,分析如何利用递归实现二叉树到字符串的转换,并解读其中关键的边界处理技巧,帮助读者深入理解递归在树形结构问题中的应用思路。

文章目录:

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

链接直达:根据二叉树创建字符串


二、思路分析

要求将二叉树按照"根节点(左子树)(右子树)"的格式转化为字符串,且有两个关键规则:若左子树为空但右子树非空,需保留左子树的空括号 () ;若右子树为空,可直接省略其括号。
【核心思路】

前序递归遍历二叉树:先处理根节点,再递归处理左子树,最后递归处理右子树;

同时在遍历过程中根据左右子树的存在情况,动态添加括号并处理边界条件,确保输出格式符合要求。

三、代码

1.代码分析

1.1 主方法tree2str

  • 初始化StringBuilder,用于高效拼接字符;
  • 调用递归辅助方法tree2strChild处理节点;
  • 转换完成后返回

1.2 递归辅助方法tree2strChild

  • 当root为空时,直接返回;
  • 不为空,就将当前跟节点的值拼接到StringBuilder中;
  • 处理左子树:
  • 如果左子树不为空,先拼接"(",递归处理左子树,再拼接")";
  • 如果左子树为空,判断右子树,右子树如果也为空,直接返回。如果右子树不为空,拼接"()";
  • 处理右子树:
  • 如果右子树不为空,重复上述左子树步骤,拼接括号然后递归再拼接括号;
  • 如果右子树为空,直接返回

2.代码展示

java 复制代码
public String tree2str(TreeNode root) {
        StringBuilder stringBuilder = new StringBuilder();
        tree2strChild(root,stringBuilder);
        return stringBuilder.toString();
    }
    public void tree2strChild(TreeNode root , StringBuilder stringBuilder){
        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;
            }else{
                stringBuilder.append("()");
            }
        }
        //右子树
        if(root.right!=null){
            stringBuilder.append("(");
            tree2strChild(root.right,stringBuilder);
            stringBuilder.append(")");
        }else{
            return;
            }
        }

【总结】

本文通过分析 tree2str 的递归实现代码,梳理了二叉树转字符串问题的核心解题逻辑:以前序递归遍历为基础,结合对左右子树存在性的边界判断,精准控制括号的添加时机与格式。该解法的关键在于对"左空右非空需保留左空括号"这一边界条件的处理,既体现了递归在树形结构遍历中的简洁性,也考验了对问题细节的把控能力。掌握这一思路后,面对类似的二叉树结构转化问题,也能快速梳理出递归遍历与边界处理的核心逻辑。


相关推荐
W230357657311 小时前
经典算法:最长上升子序列(LIS)深度解析 C++ 实现
开发语言·c++·算法
minji...12 小时前
Linux 线程同步与互斥(三) 生产者消费者模型,基于阻塞队列的生产者消费者模型的代码实现
linux·运维·服务器·开发语言·网络·c++·算法
语戚13 小时前
力扣 968. 监控二叉树 —— 贪心 & 树形 DP 双解法递归 + 非递归全解(Java 实现)
java·算法·leetcode·贪心算法·动态规划·力扣·
skywalker_1113 小时前
力扣hot100-7(接雨水),8(无重复字符的最长子串)
算法·leetcode·职场和发展
bIo7lyA8v14 小时前
算法稳定性分析中的输入扰动建模的技术9
算法
CoderCodingNo14 小时前
【GESP】C++三级真题 luogu-B4499, [GESP202603 三级] 二进制回文串
数据结构·c++·算法
sinat_2869451914 小时前
AI Coding 时代的 TDD:从理念到工程落地
人工智能·深度学习·算法·tdd
炽烈小老头14 小时前
【 每天学习一点算法 2026/04/12】x 的平方根
学习·算法
ASKED_201914 小时前
从排序到生成:腾讯广告算法大赛 2025 baseline解读
人工智能·算法