题意

给一棵二叉树,把它转化为字符串返回。转化字符串的要求如下:

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:英文分析链接

最新文章

  1. SQL Server ErrorLog
  2. PAT 02-线性结构1 两个有序链表序列的合并 (15分)
  3. 我的c程序
  4. break; continue; goto; return在循环中的应用
  5. Android自动化测试之Monkey Test 安装(二)
  6. iOS— UIScrollView和 UIPageControl之间的那些事
  7. UIView背景渐变三种方法
  8. WP开发笔记——去除 HTML 标签
  9. JSP-tag文件使用介绍
  10. Swift - 04 - 浮点型
  11. 客户端JavaScript(window、document、element)
  12. Android——init可执行程序
  13. css实现梯形标签页
  14. UINavigationController 返回手势与 leftBarButtonItem
  15. fineuploader使用实例
  16. Java学习笔记——String与StringBuffer
  17. openstack项目【day24】:VLAN模式
  18. git 提交小备注
  19. 移动环境下DNS解析失败后的优化方案
  20. cocos2dx 2.x 粒子渲染时有黑色粒BUG

热门文章

  1. 多个tomcat配置,解决冲突问题
  2. Android View事件分发与传递
  3. Java单例模式解析(收藏)
  4. [Offer收割]编程练习赛37
  5. java题(转载)
  6. jQuery基本选择器模块(二)
  7. 如何用PYTHON代码写出音乐
  8. highcharts例子
  9. 机器学习PAI快速入门
  10. hibernate中session的get和load方法的区别和联系: