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中的 ...
随机推荐
- Oracle绝对秒数转换为时间戳
一般Oracle得到的时间格式为: 1970-01-05 01:23:56.297 为了计算两个时间的差值: 1970-01-05 01:23:56.297 与 1970-01-05 01:24:57 ...
- python 菱形继承问题究极版
如果只是正常的菱形继承,经典类(python2中最后一个父类不继承object类)是深度优先,即会从左边父类开始一路走到底 新式类(最后一个父类继承了object类)是广度优先,即从左边父类开始继承, ...
- Python内置函数(22)——float
英文文档: class float([x]) Return a floating point number constructed from a number or string x. If the ...
- VM14安装Mas os 13
工具/原料 VMware Workstation unlocker(for OS X 插件补丁) macOS 10.13镜像 vmware tools 安装前准备 1 下载以上文件: 1. ...
- 从零开始学习PYTHON3讲义(五)while循环和棋盘麦粒问题
<从零开始PYTHON3>第五讲 上一节课重点学习了字符串,并且传递了一个重要的理念,就是程序要对开发人员自己和用户都足够友好.在这个过程中,利用字符串给出充分.完整.准确的提示是非常重 ...
- jaeger 使用初探
导读:有一天我们接到这样一条客诉“你们的收银软件最近特别慢,严重影响我们的收银效率,再不解决我们就不用了”,我相信大家应该都遇到过这种问题,即使现在没遇到,将来一定会遇到的,那遇到了怎么办呢?就这个话 ...
- JDK源码分析(1)之 String 相关
在此之前有无数次下定决心要把JDK的源码大致看一遍,但是每次还没点开就已被一个超链接或者其他事情吸引直接跳开了.直到最近突然意识到,因为对源码的了解不深导致踩了许多莫名其妙的坑,所以再次下定决心要把 ...
- javaWeb项目中的路径格式 请求url地址 客户端路径 服务端路径 url-pattern 路径 获取资源路径 地址 url
javaweb项目中有很多场景的路径客户端的POST/GET请求,服务器的请求转发,资源获取需要设置路径等这些路径表达的含义都有不同,所以想要更好的书写规范有用的路径代码 需要对路径有一个清晰地认知 ...
- 记录:C++类内存分布(虚继承与虚函数)
工具:VS2013 先说一下VS环境下查看类内存分布的方法: 先选择左侧的C/C++->命令行,然后在其他选项这里写上/d1 reportAllClassLayout,它可以看到所有相关类的内存 ...
- 第31章 日志 - Identity Server 4 中文文档(v1.0.0)
IdentityServer使用ASP.NET Core提供的标准日志记录工具.Microsoft文档有一个很好的介绍和内置日志记录提供程序的描述. 我们大致遵循Microsoft使用日志级别的指导原 ...