Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
前言
今天的题目为简单,算是比较简单的递归题型,题目给的例子十分的常规,对于完全没有接触过递归的是一个不错的入门题。
每日一题
今天的题目是 606. 根据二叉树创建字符串,难度为简单
-
你需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串。
-
空节点则用一对空括号 "()" 表示。而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。
示例 1:
输入: 二叉树: [1,2,3,4]
1
/ \
2 3
/
4
输出: "1(2(4))(3)"
解释: 原本将是“1(2(4)())(3())”,
在你省略所有不必要的空括号对之后,
它将是“1(2(4))(3)”。
示例 2:
输入: 二叉树: [1,2,3,null,4]
1
/ \
2 3
\
4
输出: "1(2()(4))(3)"
解释: 和第一个示例相似,
除了我们不能省略第一个对括号来中断输入和输出之间的一对一映射关系。
题解
递归解法
树结构题,一般都是用递归的思维去做,然后就是要看一下题目给出的输入结点是什么结构:
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
从函数上面的注释中,我们就能够得到,这个树的每个结点下有三个属性,一个 val 代表当前结点的值,还有一个 left 和一个 right 分别代表当前结点的左孩子和右孩子。
那么结构目前结构就很清晰了,我们开始去分析题目需要我们做的,题目上说结点需要按照前序遍历的顺序排列,那也就是先根节点然后左节点然后右节点,那么我们要做的就是去分析当前结点的左右结点的情况是什么样的,以及我们需要进行什么操作。
-
当前结点不存在,直接返回空
-
当前结点存在,没有左节点以及右节点,那就返回它的 val
-
当前结点有左节点也有右节点,那么就用括号将两个结点包起来,并且要主要抱起来的是将左节点或者右节点作为参数丢进去的递归函数
-
当结点没有左节点但是有右节点,这种情况我们可以使用上面都有的逻辑,因为在右节点前面的左节点,哪怕是没有也要加上括号,那么传入的左节点如果为空,就会返回一个空值,这样就是一个空的括号了
-
当结点只有左节点,没有右节点,这个情况就需要单独判断,因为按照示例里面的样子,不存在右节点的时候是不需要一个空的括号的,那么在这种情况下我们单独用一个括号包裹左孩子就好了。
综上,我们就能够得出我们的递归解法:
/**
* @param {TreeNode} root
* @return {string}
*/
var tree2str = function(root) {
if (!root) {
return "";
}
if (!root.left && !root.right) {
return root.val;
}
if (!root.right) {
return root.val + '(' + tree2str(root.left) + ')';
}
return root.val + '(' + tree2str(root.left) + ')(' + tree2str(root.right) + ')';
};