这是悦乐书的第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实现)的更多相关文章

  1. LeetCode算法题-Maximum Depth of Binary Tree

    这是悦乐书的第164次更新,第166篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第23题(顺位题号是104).给定二叉树,找到它的最大深度.最大深度是从根节点到最远叶节 ...

  2. LeetCode算法题-Minimum Depth of Binary Tree(Java实现)

    这是悦乐书的第168次更新,第170篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第27题(顺位题号是111).给定二叉树,找到它的最小深度.最小深度是沿从根节点到最近的 ...

  3. 【LeetCode】606. Construct String from Binary Tree 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:先序遍历 日期 题目地址:https://l ...

  4. Python 解LeetCode:606 Construct String from Binary Tree

    题目描述:用先序遍历的方式把二叉树转换成字符串,其中结点用括号分割,具体示例见题目链接 思路: 先序遍历,先把根结点的值转化成字符串,然后递归的把左右子树的值转化成字符串 把1中的根结点和左右子结点的 ...

  5. 606. Construct String from Binary Tree 【easy】

    606. Construct String from Binary Tree [easy] You need to construct a string consists of parenthesis ...

  6. 【Leetcode_easy】606. Construct String from Binary Tree

    problem 606. Construct String from Binary Tree 参考 1. Leetcode_easy_606. Construct String from Binary ...

  7. LeetCode算法题-Construct Quad Tree(Java实现)

    这是悦乐书的第224次更新,第237篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第91题(顺位题号是427).我们想使用四叉树来存储N×N布尔网格.网格中的每个单元格只 ...

  8. LeetCode算法题-Search in a Binary Search Tree(Java实现)

    这是悦乐书的第295次更新,第314篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第163题(顺位题号是700).给定一个二叉搜索树(BST)的和正整数val. 你需要在 ...

  9. LeetCode算法题-Find Mode in Binary Search Tree(Java实现)

    这是悦乐书的第246次更新,第259篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第113题(顺位题号是501).给定具有重复项的二叉搜索树(BST),找到给定BST中的 ...

随机推荐

  1. 受到 1 万点暴击,二狗子被 DDoS 攻击的惨痛经历

    二狗子的遭遇 “好消息,好消息,免费 DDoS 攻击软件上线了,性感黑客在线攻击,帮您攻克所有商业难题.”二狗子不知道在看着什么网站,新买的 Mac 中发出热闹的声音. 二狗子想知道“DDoS 是什么 ...

  2. C# 调用IP库(QQWry.Dat)查询IP位置及自动升级IP库方法【转】

    前言 C# 用IP地址(123.125.114.144)查询位置(北京市百度公司)的东西,非常好用也非常方便,可手动升级刷新IP库,一次编码永久收益,可支持winform.asp.net等程序. 本文 ...

  3. Python爬虫入门教程 13-100 斗图啦表情包多线程爬取

    斗图啦表情包多线程爬取-写在前面 今天在CSDN博客,发现好多人写爬虫都在爬取一个叫做斗图啦的网站,里面很多表情包,然后瞅了瞅,各种实现方式都有,今天我给你实现一个多线程版本的.关键技术点 aioht ...

  4. RBAC用户特别授权的思考

    场景: 标准的RBAC,授权只应该赋予角色,再把角色指派给用户,当需要对特定用户授予权限时,就只能新建一个角色指派给这个用户.这就意味着每对一个新用户做特别授权都要创建一个特别角色. 今天脑洞大开,想 ...

  5. .NET应用程序管理服务AMS设计

    AMS全称是Application Management Server即应用程序管理服:由于经常要写些一些应用服务,每次部署和维护都比较麻烦,首先要针对服务编写一个windows服务程序方便系统启动里 ...

  6. 重排序、hb、ConcurrentHashMap弱一致性(jdk1.6)

    double pi = 3.14; //A double r = 1.0; //B double area = pi * r * r; //C 1.A -> B    //不满足happens- ...

  7. Redis【入门】就这一篇!

    Redis 概述 在我们日常的Java Web开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题,可是一旦涉及大数据量的需求,比如一 ...

  8. C#线程安全使用(四)

    这是时隔多年第四篇,主要是因为身在东软受内网限制,好多文章就只好发到东软内部网站,懒的发到外面,现在一点点把在东软写的文章给转移出来. 这里主要讲解下CancellationTokenSource,C ...

  9. 阿里云HBase全新发布X-Pack 赋能轻量级大数据平台

    一.八年双十一,造就国内最大最专业HBase技术团队 阿里巴巴集团早在2010开始研究并把HBase投入生产环境使用,从最初的淘宝历史交易记录,到蚂蚁安全风控数据存储.持续8年的投入,历经8年双十一锻 ...

  10. AppBoxFuture(二): Say goodbye to sql!

      信息管理类应用系统离不开关系数据存储,目前大家基本都使用的是传统的数据库如MySql.Postgres等.作者从事信息化建设十多年,个人认为传统的数据库存在以下的问题: 扩展问题:   系统数据的 ...