【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

数据结构:kmp算法,Trie树,以及并查集的干货详解---小白也能看懂

数据结构:kmp算法,Trie树,以及并查集的干货详解---小白也能看懂

🎬 博主名称:个人主页 🔥 个人专栏: 《算法通关》,《Java讲解》 ⛺️心简单,世界就简单 序言 昨晚数据结构写了一半,做图太累了,文章写的比较慢,这篇应该就是第二篇,后面还有一篇,太困了,真不行了 今天讲一下 kmp算法,Trie, 并查集 目录 序言 KMP算法 原理 next数组 匹配过程 Trie树 并查集 KMP算法 这里说一下kmp的大致情况 用于处理字符串匹配问题,他也是十分的抽象                给一个S[]主串(比较长的那个),P[]为模板串,kmp我们一般用下标1来开始遍历 接下来我们需要去思考的是 1,暴力去怎么做 2,怎么去优化 下面是暴力的模板代码 大概意思就是,每当我们匹配到不一样的部位,我们的P就要从头开始再跟刚刚s的起点+1位置重新匹配,        这样就会造成串的长度很长时候,就会超时,所以我们就要从这个过程中找性质了

By Ne0inhk
【设计模式】策略模式:可插拔算法,从硬编码到灵活适配,体会“算法解耦“思想

【设计模式】策略模式:可插拔算法,从硬编码到灵活适配,体会“算法解耦“思想

半桔:个人主页  🔥 个人专栏: 《设计模式》《手撕面试算法》《C++从入门到入土》 🔖恐惧囚禁人的灵魂,希望可以让你自由。《肖申克的救赎》 文章目录 * 一. 光头强转行 * 1.1 团结屯的故事 * 1.2 新工作,新需求 * 二. 光头强的OO天赋 * 三. 李老板的新需求 * 3.1 出大问题了 * 3.2 继承可能不是答案 * 四. 最终方案 * 五. 总结 一. 光头强转行 1.1 团结屯的故事 我是光头强。以前,我每天的生活就是被两头臭狗熊按在地上摩擦,不仅树砍不到,还要承受李老板的夺命连环Call和扣工资威胁。 直到有一天,我捡到了一本《C++ Primer》(虽然我也忘了森林里为啥会有这书)。那一刻,

By Ne0inhk
剑指offer第2版:链表系列

剑指offer第2版:链表系列

一、p58-JZ6 从尾到头打印链表(递归/栈) 从尾到头打印链表_牛客题霸_牛客网  解法1、递归,每访问一个节点时,先递归输出它后面的节点,再输出该节点自身,但是这样的话可能导致函数的调用层级很深,从而导致函数调用栈溢出。 class Solution { public: void print(vector<int>&ret,ListNode* head){ if(head==nullptr) return; print(ret,head->next); ret.emplace_back(head->val); } vector<int> printListFromTailToHead(ListNode* head)

By Ne0inhk
《链表面试基础看点:这里不止“快慢指针”的完美实现,更懂“哨兵节点”的巧妙运用》

《链表面试基础看点:这里不止“快慢指针”的完美实现,更懂“哨兵节点”的巧妙运用》

🔥@晨非辰Tong:个人主页  👀专栏:《C语言》、《数据结构与算法》、《数据结构与算法刷题集》 💪学习阶段:C语言、数据结构与算法初学者 ⏳“人理解迭代,神理解递归。” 引言:链表刷题进行时。寻找中间结点,看似简单,但你的解法是否考虑了所有边界情况?本文手把手带你用“快慢指针”写出完美解,以及“哨兵节点”对合并链表的简化实现。 目录 1.  876. 链表的中间结点 - 力扣(LeetCode)(快慢指针) 2.  21. 合并两个有序链表 - 力扣(LeetCode) 1.  876. 链表的中间结点 - 力扣(LeetCode)(快慢指针) 方法一:遍历链表计算总大小,算出mid,将首节点指针向后mid个节点。(容易想到) 方法二:使用快、

By Ne0inhk