【刷题笔记】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 ...
随机推荐
- winfrom窗体属性
- linux下使用bcp备份sybase数据
命令|数据库名|表名|导出到|文件名|格式|sybase服务名|数据库登录名 |字符集 bcp dbname..tablename out filename -n -Sgfdmhk -UISISMan ...
- VS2015启动显示ID为XXXX的进程当前未运行
解决办法:在启动项目根目录下用文本编辑器打开Web项目下的{X}.csproj文件,然后查找 <WebProjectProperties>,将这一对标签之间的内容全部删除,然后再打开项目就 ...
- windows安装pyspider
基本环境 python2.7 win7 64bit 问题 Microsoft Visual C++ 10.0 is required Microsoft Visual C++ Compiler for ...
- Websphere 手动模拟删除应用操作
Websphere 手动模拟删除应用操作 切记:不要在程序还在运行的时候,直接的remove掉应用程序,不然,会发生意外的错误. 最近,在项目中,不小心手动移除了正在运行的应用,发现se ...
- 基于ACE的TAO开发---一个简单的入门实例-----VS2008(二)
上一节已经说了如何编译idl文件.现在就用编好的文件来写一个最小的corba小程序的.程序分为服务器程序和客户端程序. 说明下,代码是<基于C++CORBA高级编程>一书中的例子. 1.首 ...
- UWP App Services in Windows 10
1.AppServices in Universal Windows Platform(UWP) UWP 应用服务可以提供给另一个UWP应用.在Win10系统中,一个应用服务当作应用的一个方法和机制来 ...
- Kinect+OpenNI+OpenCV使用
关于OpenNI,已经可以使用2.0,可以不再使用PrimeSense: 这里的是转载其他人的 OpenCV系列: 原文:http://blog.csdn.net/chenxin_130/articl ...
- 【udacity】机器学习-波士顿房价预测
import numpy as np import pandas as pd from Udacity.model_check.boston_house_price import visuals as ...
- linux内核内存分配(一、基本概念)
内存分配是Linux比较复杂也是比较重要的部分,这个和ssd驱动很类似:物理地址和虚拟地址的映射关系.下面总结下最近看到的有关内存分配的内容和自己的理解: 1.一致内存访问和非一致内存访问 上图来自& ...