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中的 ...
随机推荐
- 【netty】(2)---搭建一个简单服务器
netty(2)---搭建一个简单服务器 说明:本篇博客是基于学习慕课网有关视频教学.效果:当用户访问:localhost:8088 后 服务器返回 "hello netty"; ...
- 【WebApi】通过HttpClient调用Web Api接口
HttpClient是一个封装好的类,它在很多语言中都有被实现,现在HttpClient最新的版本是4.5. 它支持所有的http方法,自动转向,https协议,代理服务器. 一.Api接口参数标准化 ...
- asp.net core 系列 6 MVC框架路由(下)
一.URL 生成 接着上篇讲MVC的路由,MVC 应用程序可以使用路由的 URL 生成功能,生成指向操作的 URL 链接. 生成 URL 可消除硬编码 URL,使代码更稳定.更易维护. 此部分重点介绍 ...
- EFCore合并多条迁移记录
方法来自 merge-migrations-in-entity-framework-core 更新数据库到最新结构 删除迁移目录下的所有迁移脚本 新建一个迁移 注释掉Up()和Down()方法中的代码 ...
- C++版 - UVa1585 Score - 题解
C++版 - UVa1585 Score - 题解 <算法竞赛入门经典(第二版)> 习题3-1 得分(ACM/ICPC Seoul 2005,UVa1585) 问题描述: 给出一个由O和X ...
- C#2.0 委托
委托 委托是一个非常不错的设计,允许我们把方法做为参数传递,实现了开放閉放原则.在方法中我们只要有一个委托占位,调用者就可以传入符合签名的方法来做不同的操作,这也面向对象开发中多态的魅力. 但是在C# ...
- 三种方法实现CSS三栏布局
本文由云+社区发表 作者:前端林子 本文会分别介绍三种CSS实现三栏布局的方法,可在浏览器中打开查看效果 1.方法一:自身浮动的方法 实现方法:需要左栏向左浮动,右栏向右浮动,中间设左右margin来 ...
- MariaDB主从复制的逻辑与实现
一.关系型数据库的劣势 “关系型数据库:指采用了关系模型来组织数据的数据库,而关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织.”——Wiki 关系型数据 ...
- 消息队列中间件(三)Kafka 入门指南
Kafka 来源 Kafka的前身是由LinkedIn开源的一款产品,2011年初开始开源,加入了 Apache 基金会,2012年从 Apache Incubator 毕业变成了 Apache 顶级 ...
- [PHP] yield沟通函数循环内外
1.yield是函数内外,循环内外沟通用的 , 当你的函数需要返回一个大数组 , 循环的时候需要遍历这个大数组时 , 并且需要多次遍历这个函数的返回值 , 这个是有用的 2.当我也是只需要在一次循环中 ...