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

【LeetCode经典题解】:二叉树转字符串递归解法的核心逻辑与代码解剖
在这里插入图片描述
🎁个人主页:User_芊芊君子
🎉欢迎大家点赞👍评论📝收藏⭐文章
🔍系列专栏:Java.数据结构
在这里插入图片描述


在这里插入图片描述


【前言】

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

文章目录:

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

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


在这里插入图片描述

二、思路分析

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

前序递归遍历二叉树:先处理根节点,再递归处理左子树,最后递归处理右子树;
同时在遍历过程中根据左右子树的存在情况,动态添加括号并处理边界条件,确保输出格式符合要求。
在这里插入图片描述

三、代码

1.代码分析

1.1 主方法tree2str

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

1.2 递归辅助方法tree2strChild

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

2.代码展示

publicStringtree2str(TreeNode root){StringBuilder stringBuilder =newStringBuilder();tree2strChild(root,stringBuilder);return stringBuilder.toString();}publicvoidtree2strChild(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 的递归实现代码,梳理了二叉树转字符串问题的核心解题逻辑:以前序递归遍历为基础,结合对左右子树存在性的边界判断,精准控制括号的添加时机与格式。该解法的关键在于对“左空右非空需保留左空括号”这一边界条件的处理,既体现了递归在树形结构遍历中的简洁性,也考验了对问题细节的把控能力。掌握这一思路后,面对类似的二叉树结构转化问题,也能快速梳理出递归遍历与边界处理的核心逻辑。
在这里插入图片描述

Read more

【C++】string类

【C++】string类

C++ string 类全面解析 1. 为什么学习 string 类? 1.1 C语言中的字符串局限性 在C语言中,字符串是以\0结尾的字符数组,这种表示方式存在几个明显的缺陷: C语言字符串的主要问题: * 安全性问题:容易发生缓冲区溢出,导致程序崩溃或安全漏洞 * 内存管理复杂:需要手动管理内存分配和释放,容易造成内存泄漏 * 功能有限:标准库函数功能相对基础,复杂的字符串操作需要自行实现 * 不符合面向对象思想:数据与操作分离,不符合现代编程范式 // C语言字符串操作的典型问题char str[10];strcpy(str,"这个字符串太长了会导致溢出");// 潜在的安全风险 1.2 实际应用需求 在现代编程中,字符串处理占据了极大的比重。无论是Web开发、数据处理还是系统编程,都离不开高效的字符串操作。string类的出现正是为了解决C语言字符串的种种痛点。 面试题示例(后续详解): * 字符串转整型数字 * 大数相加(字符串形式)

By Ne0inhk

深入解析C++轻量级WebServer实现

目录 写在前面 概述:这是基于bs模型并且使用epoll实现的高并发服务器,使用线程池+连接池+使用同步或异步的日志系统+定时器等; 线程池使用整体架构图 线程池详细工作流程图 数据库连接池和数据库服务器与线程池的关系 数据库与线程池共同使用流程图 Main.cpp Webserver.h+Webserver.cpp Webserver类的init的函数参数讲解: Webserver.cpp WebServer类的WebServer实现: WebServer::~WebServer()的实现 WebServer::init()的实现: WebServer::trig_mode()的实现: WebServer::log_write() WebServer::sql_pool() WebServer::thread_pool() Timer lst_timer.h lst_timer.cpp Threadpool CGImysql

By Ne0inhk
【C++ Qt】网络编程(QUdpSocket、QTcpSocket、Http)

【C++ Qt】网络编程(QUdpSocket、QTcpSocket、Http)

每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry” 绪论 : 本章将提到Qt中的网络部分,在看这篇文章之前需要有一定的网络基础也就是TCP/HTTP、本篇文章主要讲到的是Qt中基础的Udp、Tcp、Http的使用方法,并附有了多个小demo方便实操练习,并且其中还在每章最后进行了小总结回顾重要接口和函数方便回顾。 ———————— 早关注不迷路,话不多说安全带系好,发车啦(建议电脑观看)。 网络编程主要依赖于操作系统提供的Socket API。需要注意的是,C++标准库本身并未封装网络编程相关的API。 关于Qt网络编程的几个要点: 1. 网络应用开发本质上是编写应用层代码,需要传输层协议(如TCP/UDP)的支持 2. 为此,Qt提供了两套专门的网络编程API(QUDPSocket和QTcpSocket) 3. 使用Qt网络编程API时,需先在.pro文件中添加network模块 4. 之前学习的Qt控件和核心功能都属于QtCore模块(默认已包含) 为什么Qt要划分出这些模块呢? Qt 本身是一个非常庞

By Ne0inhk
深入解剖STL RB-tree(红黑树):用图解带入相关复杂操作实现

深入解剖STL RB-tree(红黑树):用图解带入相关复杂操作实现

👇点击进入作者专栏: 《算法画解》 ✅ 《linux系统编程》✅ 《C++》 ✅ 文章目录 * 一、红黑树介绍 * 1. 什么是红黑树? * 2. 红黑树的规则 * 3. 为什么最长路径不超过最短路径的两倍? * 4. 红黑树的效率 * 二、红黑树的实现 * 2.1 红黑树的节点结构 * 2.2 红黑树整体结构 * 三、红黑树的插入操作 * 3.1 插入的大致流程 * 3.2 插入后的三种情况 * 情况1:叔叔节点存在且为红色(变色处理) * 情况2:叔叔节点不存在或为黑色 + cur和p在同一侧(单旋+变色) * 情况3:叔叔节点不存在或为黑色 + cur和p在不同侧(双旋+变色) * 3.3 插入完整代码 * 3.4 旋转操作的实现

By Ne0inhk