【刷题笔记】LeetCode 606. Construct String from Binary Tree
题意
给一棵二叉树,把它转化为字符串返回。转化字符串的要求如下:
1. null 直接转化为 () ;(这个要求其实有点误导人~)
2. 子节点用 () 包裹起来;(这是我自己根据例子添加的要求)
3. 省略所有不影响 二叉树 与 字符串 之间 一对一 关系的 () ;
代码
//JavaScript
var tree2str = function(t) {
if(t === null) return '';
if(t.left === null && t.right === null) return ''+t.val;
return '' + t.val + '(' + tree2str(t.left) + ')' + (t.right === null ? '' : '(' + tree2str(t.right) + ')');
};
简单的二叉树题目,一般我都期待能用简单的递归完成。
这道题起初我把问题想得太复杂,以为需要一个辅助函数。分析例子和答案之后才发现其实不用。
三种情况
三种情况分别对应上面三行代码
情况一:
if(t === null) return '';
这种情况究竟需要 return ''; 还是 return '()'; 呢?
上面说过,LeetCode原题的描述有点误导人。
我自己的分析是: () 是父节点 用来包裹 子节点,以区分层级关系的。所以如果用递归,需要包裹括号的时候,也应该由父节点来执行包裹这个动作,不然不好分析,而且需要额外处理特殊情况。所以最好还是 return '';
情况二:
if(t.left === null && t.right === null) return ''+t.val;
这个情况相对简单,因为前面我们分析过了,最好由父节点来执行包裹括号的操作,所以这里我们的逻辑就比较简明。
情况三:
//当节点 t 不为 null,且它至少有一个子节点不为 null
return '' + t.val + '(' + tree2str(t.left) + ')' + (t.right === null ? '' : '(' + tree2str(t.right) + ')');

这种情况相对烧脑。因为题目的误导,一开始我想的很深,结果做出来,发现没有那么复杂。
例如上面的对应字符串为: "1(2(4(6)))(3()(5(7)))" 。
做出来之后重新分析了一下,发现其实是这样的:
1. 一个 () 只包裹一个子树,所以其实当右子树是 null 的时候,可以直接省略掉右子树字符串(不会影响整体布局),当然左子树为 null 的时候不一定可以。
2. 在第三种情况下, '(' + tree2str(t.left) + ')' 一定需要调用,为什么呢?因为如果左子树为 null ,则证明右子树不为 null (因为第三种情况是至少有一个子树不为 null ),在这种情况下,左子树一定要有一个空括号来占一个位置,才不会影响树的整体布局;而当左子树不为 null 时,废话不多说,当然要调用。
PS:英文分析链接
【刷题笔记】LeetCode 606. Construct String from Binary Tree的更多相关文章
- LeetCode 606. Construct String from Binary Tree (建立一个二叉树的string)
You need to construct a string consists of parenthesis and integers from a binary tree with the preo ...
- LeetCode 606 Construct String from Binary Tree 解题报告
题目要求 You need to construct a string consists of parenthesis and integers from a binary tree with the ...
- LeetCode 606. Construct String from Binary Tree根据二叉树创建字符串 (C++)
题目: You need to construct a string consists of parenthesis and integers from a binary tree with the ...
- 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】606. Construct String from Binary Tree 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:先序遍历 日期 题目地址:https://l ...
- [LeetCode&Python] Problem 606. Construct String from Binary Tree
You need to construct a string consists of parenthesis and integers from a binary tree with the preo ...
- 606. Construct String from Binary Tree 从二叉树中构建字符串
[抄题]: You need to construct a string consists of parenthesis and integers from a binary tree with th ...
- 606. Construct String from Binary Tree
You need to construct a string consists of parenthesis and integers from a binary tree with the preo ...
随机推荐
- 前端学习笔记-HTML(一)
- 如何参加topcoder
1.注册账号 2.安装java运行环境 3.下载客户端 4.提示:应用程序已被java安全阻止:控制面板里找到java,将topcoder.com添加到安全列表 5.运行客户端
- arttemplate.js原生写法案例
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- Android WiFi热点完全研究(自定义创建、跳转系统界面设置、读取配置、切换,Android6.0适配)
前言: WiFi热点设置页面的安全性选项在Android 4.x上有“无”.“WPA PSK”.“WPA2 PSK”三个选项,在Android 5.0(含)之后去掉了WPA PSK选项(部分手机厂家会 ...
- java函数式编程之lambda表达式
作为比较老牌的面向对象的编程语言java,在对函数式编程的支持上一直不温不火. 认为面向对象式编程就应该纯粹的面向对象,于是经常看到这样的写法:如果你想写一个方法,那么就必须把它放到一个类里面,然后n ...
- css3动画,点击圆形背景扩展整个页面效果
上次做项目的时候,要求点击链接,这个链接的圆形背景扩散充满整个页面,今天把这个效果整理一下,是简单的css3的动画特效,粘贴下面的代码看效果 <!DOCTYPE html> <htm ...
- C# 把对象序列化 JSON 字符串 和把JSON字符串还原为对象
/// <summary> /// 把对象序列化 JSON 字符串 /// </summary> /// <typeparam name="T"> ...
- 主从同步工作过程?(binlog日志)
在从数据库服务器的/var/lib/mysql/master.info 记录连接主数据库服务器信息文件mail-relay-bin.XXXXXX 中继日志文件(记录SQL)mail-relay ...
- python tips:类与实例的属性问题
实例是具象化的类,它可以作为类访问所有静态绑定到类上的属性,包括类变量与方法,也可以作为实例访问动态绑定到实例上的属性. 实例1: class A: work = list("hello&q ...
- Centos7 单节点安装 FastDFS + FastDHT服务
Centos7 单节点安装 FastDFS + FastDHT服务 1.安装gcc(编译时需要) FastDFS是C语言开发,安装FastDFS需要先将官网下载的源码进行编译,编译依赖gcc环境,如果 ...