力扣【二叉树专题】606. 根据二叉树创建字符串

92 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第 10 天,点击查看活动详情

题目链接

606. 根据二叉树创建字符串 - 力扣(LeetCode)

题目描述

给你二叉树的根节点 root ,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。

空节点使用一对空括号对 "()" 表示,转化后需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。

测试用例

示例 1:

image.png

输入:root = [1,2,3,4]
输出:"1(2(4))(3)"
解释:初步转化后得到 "1(2(4)())(3()())" ,但省略所有不必要的空括号对后,字符串应该是"1(2(4))(3)" 。

限制

  • 树中节点的数目在范围 [1,104][1, 10^4] 内
  • 1000<=Node.val<=1000-1000 <= Node.val <= 1000

题目分析

题目需要我们将节点转化为带 () 的字符串 ,配合示例的描述,以 节点4 这个子树为例,他的字符表述为 s1 = 4()(),因为他的子节点都为空,因此可以省略为 s1 = 4;以 节点2 这个子树为例,他的左子树的字符串表达为 s1,他的右子树为空,合计的表达即为 s2 = 2(s1)(),省略掉为空的右子树,以及替换 s1 的值后,s2 = 2(4);其他的子树,都按照这种规则进行处理

我们对节点 n 的左右子树left, right 是否为空,共计有4种组合,我们针对这 4 种组合进行判断并返回字符串即可;这种处理的思路,建立在对树的后序遍历的基础上 (因为可以拿到左右子树的返回值)

代码实现

完整的代码实现如下

var tree2str = function (root) {
    let str  =  trave(root);
    return str.slice(1,str.length-1)
    function trave(node) {
        if (node == null) return '()';
        let left = trave(node.left);
        let right = trave(node.right);
        if (left == '()' && right == '()') {
            return `(${node.val})`;
        } else if (left == '()') {
            return `(${node.val}()${right})`
        } else if (right == '()') {
            return `(${node.val}${left})`
        } else {
            return `(${node.val + left + right})`
        }
    }
};

image.png