LeetCode算法题-Construct String from Binary Tree(Java实现)
这是悦乐书的第273次更新,第288篇原创
01 看题和准备
今天介绍的是LeetCode算法题中Easy级别的第141题(顺位题号是606)。构造一个字符串,该字符串由二叉树中的括号和整数组成,并具有前序遍历方式。null节点需要用空括号对“()”表示。 并且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。例如:
输入:二叉树:[1,2,3,4]
1
/ \
2 3
/
4
输出:“1(2(4))(3)”
说明:原始字符串需要为“1(2(4)())(3()())”,但是需要省略所有不必要的空括号对,所以是“1(2(4))(3)”。
输入:二叉树:[1,2,3,null,4]
1
/ \
2 3
\
4
输出:“1(2()(4))(3)”
说明:与第一个示例几乎相同,但是不能省略第一个括号对来打破输入和输出之间的一对一映射关系。
本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。
02 第一种解法
题目有两点要求,一是前序遍历二叉树,二是使用括号将节点值串起来。同时,对于第二点又可以细分为两种情况,一是如果节点本身没有左右子节点,就不必使用括号;二是如果节点本身的左子节点不为空,右子节点为空,那么我们需要省掉右子节点的括号,直接对其左子节点继续处理。
使用递归的方式,如果当前节点为空,直接返回空串;如果当前节点不存在左右子节点,直接返回当前节点值的字符串;如果当前节点的左子节点不为空,右子节点为空,直接返回当前节点值与其左子节点的后续递归结果,其中左子节点前后需用括号。
剩下就是正常的情况,先处理根节点的值,再处理左子树,使用括号包起来,最后处理右子树,同样使用括号包起来。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public String tree2str(TreeNode t) {
String result = preOrder(t);
return result;
}
public String preOrder(TreeNode t){
if (t == null) {
return "";
}
if (t.left == null && t.right == null) {
return t.val+"";
}
if (t.right == null) {
return t.val + "("+ preOrder(t.left)+")";
}
StringBuilder sb = new StringBuilder();
sb.append(t.val);
String s = preOrder(t.left);
sb.append("("+s+")");
String s2 = preOrder(t.right);
sb.append("("+s2+")");
return sb.toString();
}
}
03 第二种解法
我们可以把上面的写法简化下,在一个方法里面完成,并且去掉StringBuilder类操作字符串,直接使用连接符拼接。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public String tree2str(TreeNode t) {
if (t == null) {
return "";
}
if (t.left == null && t.right == null) {
return t.val+"";
}
if (t.right == null) {
return t.val + "("+ tree2str(t.left)+")";
}
return t.val + "("+tree2str(t.left)+ ")" + "(" + tree2str(t.right) + ")";
}
}
04 第三种解法
我们也可以使用迭代的方式。使用迭代的方式,首先要借助栈,遍历的顺序为根节点,右子树,左子树,因为栈先进后出的特性,所以要先处理右子树,其次我们还需要考虑括号的拼接顺序问题。
如果直接使用前后括号拼接,会发现尾括号少了一部分,那么我们需要借助另外一个对象来判断什么时候该加尾部空格。对此,我们使用HashSet,存放已经访问过的节点,并且原先直接出栈的方法要换成获取栈顶的节点但是不出栈,只有都访问过了,才会出栈并追加尾部括号,另外一种特殊情况当前节点左子节点为空,右子节点不为空,直接追加一个空括号即可。
遍历完所有节点后,根据题目的要求,会发现字符串头部和尾部都多了一个单括号,所以要截取字符串,去掉头尾的单括号。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public String tree2str(TreeNode t) {
if (t == null) {
return "";
}
if (t.left == null && t.right == null) {
return t.val+"";
}
Stack<TreeNode> stack = new Stack<TreeNode>();
Set<TreeNode> visited = new HashSet<TreeNode>();
String result = "";
stack.push(t);
while (!stack.isEmpty()) {
TreeNode temp = stack.peek();
if (visited.contains(temp)) {
stack.pop();
result += ")";
} else {
visited.add(temp);
result += "(" + temp.val;
if (temp.left == null && temp.right != null) {
result += "()";
}
if (temp.right != null) {
stack.push(temp.right);
}
if (temp.left != null) {
stack.push(temp.left);
}
}
}
return result.substring(1, result.length()-1);
}
}
05 小结
算法专题目前已日更超过四个月,算法题文章141+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!
LeetCode算法题-Construct String from Binary Tree(Java实现)的更多相关文章
- LeetCode算法题-Maximum Depth of Binary Tree
这是悦乐书的第164次更新,第166篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第23题(顺位题号是104).给定二叉树,找到它的最大深度.最大深度是从根节点到最远叶节 ...
- LeetCode算法题-Minimum Depth of Binary Tree(Java实现)
这是悦乐书的第168次更新,第170篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第27题(顺位题号是111).给定二叉树,找到它的最小深度.最小深度是沿从根节点到最近的 ...
- 【LeetCode】606. Construct String from Binary Tree 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:先序遍历 日期 题目地址:https://l ...
- Python 解LeetCode:606 Construct String from Binary Tree
题目描述:用先序遍历的方式把二叉树转换成字符串,其中结点用括号分割,具体示例见题目链接 思路: 先序遍历,先把根结点的值转化成字符串,然后递归的把左右子树的值转化成字符串 把1中的根结点和左右子结点的 ...
- 606. Construct String from Binary Tree 【easy】
606. Construct String from Binary Tree [easy] You need to construct a string consists of parenthesis ...
- 【Leetcode_easy】606. Construct String from Binary Tree
problem 606. Construct String from Binary Tree 参考 1. Leetcode_easy_606. Construct String from Binary ...
- LeetCode算法题-Construct Quad Tree(Java实现)
这是悦乐书的第224次更新,第237篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第91题(顺位题号是427).我们想使用四叉树来存储N×N布尔网格.网格中的每个单元格只 ...
- LeetCode算法题-Search in a Binary Search Tree(Java实现)
这是悦乐书的第295次更新,第314篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第163题(顺位题号是700).给定一个二叉搜索树(BST)的和正整数val. 你需要在 ...
- LeetCode算法题-Find Mode in Binary Search Tree(Java实现)
这是悦乐书的第246次更新,第259篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第113题(顺位题号是501).给定具有重复项的二叉搜索树(BST),找到给定BST中的 ...
随机推荐
- Mysql篇--Linux中安装Mysql
一.前述 由于Windows安装Mysql非常麻烦,所以分享一篇Linux中对MySQL的搭建,废话不多说,来,come on. 二.步骤 2.1 yum安装 yum install mysql-se ...
- Docker 容器资源限制
Docker 容器资源限制 默认情况下,一个容器并没有资源限制,并且该容器可以使用内核调度的所有资源.Docke提供了在启动容器时设置一些参数来控制该容器使用的内存.CPU和IO. 内存 OOME:在 ...
- Mac电脑C语言开发的入门帖
本文是写给Mac电脑开发新手的入门帖,诸神请退散. C语言 C语言可说是电脑环境中的"镇国神器",从发明至今,虽然C语言的使用者缓慢的减少,但从当前市场应用情况看,尚无一台电脑能够 ...
- 精读《React PowerPlug 源码》
1. 引言 React PowerPlug 是利用 render props 进行更好状态管理的工具库. React 项目中,一般一个文件就是一个类,状态最细粒度就是文件的粒度.然而文件粒度并非状态管 ...
- python学习第三讲,python基础语法之注释,算数运算符,变量.
目录 python学习第三讲,python基础语法之注释,算数运算符,变量. 一丶python中的基础语法,注释,算数运算符,变量 1.python中的注释 2.python中的运算符. 3.pyth ...
- Spring基础系列-容器启动流程(1)
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9870339.html 概述 我说的容器启动流程涉及两种情况,SSM开发模式和Spri ...
- Perl IO:简介和常用IO模块
三篇Perl IO基础类文章: Perl的IO操作(1):文件句柄 Perl的IO操作(2):更多文件句柄的模式 Perl文件句柄相关的常见变量 IO对象和IO::Module家族模块 无论是哪种高级 ...
- .Net Core 实践 - 使用log4net记录日志(2)
实现目标:将log4net的相关操作封装成一个 .Net Standard类库 demo地址:https://github.com/PuzzledAlien/log4net_demo/tree/mas ...
- python学习笔记(七)、异常
在实际开发中,往往不会出现一个系统编写下来,没有出现任何一个bug.为处理这种会出现错误的地方,如除数为零的除法,python提供了非常强大的机制————异常处理机制. 1 异常 python使用异常 ...
- 轻松理解 Java HashMap 和 ConcurrentHashMap
前言 Map 这样的 Key Value 在软件开发中是非常经典的结构,常用于在内存中存放数据. 本篇主要想讨论 ConcurrentHashMap 这样一个并发容器,在正式开始之前我觉得有必要谈谈 ...