根据二叉树创建字符串(简单难度)(本人认为是中等难度)

简介: 根据二叉树创建字符串(简单难度)(本人认为是中等难度)

题目概述(简单难度)

你需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串。

空节点则用一对空括号 “()” 表示。而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。

示例 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)"
解释: 和第一个示例相似,
除了我们不能省略第一个对括号来中断输入和输出之间的一对一映射关系。

题目链接:

点我进入leetcode


思路与代码

思路展现

思路如下:

1:当一个结点的左子树和右子树都为空的时候直接结束

2:当一个结点的左子树为空,右子树不为空,则加上()

3:当一个结点的左子树不为空,就先加上(,然后把其所有左子树递归完毕后,加上)

4:当一个结点的右子树为空,且左子树遍历完毕,直接return

5:当一个结点的左子树遍历完毕,且右子树不为空,就先加上(,然后遍历右子树,最后再加上)。


代码示例

class Solution {
    public void tree2strChild(TreeNode root,StringBuilder sb) {
        if(root == null){
            return;
        }
        //先把根节点加进去
        sb.append(root.val);
        //此处只考虑左右的左子树
        if(root.left == null) {
            if(root.right == null) {
                //左右都为空直接结束
                return;
            }else {
                //适用于左树为空,右树不为空的情况
               sb.append("()");
          }
          //else代表考虑左树不为空的情况
        }else {
            //左树不为空的时候先放一个(
            sb.append("(");
            //然后把所有左子树递归完毕
            tree2strChild(root.left,sb);
            //所有左子树递归完毕后加入)
            sb.append(")");
        }
        //然后在考虑所有右子树
        //假设此时右子树为空
        if(root.right == null) {
            //右子树为空就直接return
           return;
        }else {
            //右子树不为空的话仍然是先加上(
           sb.append("(");
           //然后开始吧所有右子树递归完毕
           tree2strChild(root.right,sb);
           //所有右子树递归完毕后再加上)
           sb.append(")");
        }
    }
    public String tree2str(TreeNode root) {
        if(root == null) {
           return null;
        }
        StringBuilder sb = new StringBuilder();
        tree2strChild(root,sb);
        return sb.toString();
    }
}

时间复杂度:O(N),其中 N 是二叉树中的节点数目。

空间复杂度:O(N),在最坏情况下,会递归 N 层,需要 O(N) 的栈空间。

总结

这道题目还是有点难度的,适用于扩展,同学们可以好好学习下.


相关文章
|
移动开发 前端开发 数据可视化
分享63个Html后端模板,总有一款适合您
分享63个Html后端模板,总有一款适合您
363 3
|
9月前
|
机器学习/深度学习 资源调度 Java
YOLOv11改进策略【注意力机制篇】| 2024 SCI TOP FCAttention 即插即用注意力模块,增强局部和全局特征信息交互
YOLOv11改进策略【注意力机制篇】| 2024 SCI TOP FCAttention 即插即用注意力模块,增强局部和全局特征信息交互
524 1
YOLOv11改进策略【注意力机制篇】| 2024 SCI TOP FCAttention 即插即用注意力模块,增强局部和全局特征信息交互
|
Apache
基于apache集合工具包的并集、交集、差集工具类
基于apache集合工具包的并集、交集、差集工具类
333 1
|
12月前
|
敏捷开发 监控 数据可视化
2024年十大工程管理软件评测:哪些任务可视化工具能显著提高团队效率?
在数字时代,团队协作和项目管理的效率至关重要。任务可视化工具通过直观展示任务进展、资源分配和优先级,帮助团队高效协作,减少误解和沟通成本。这类工具如Trello、Asana、ClickUp等,不仅提升了任务透明度和团队协作效率,还支持实时监控与反馈,特别适合远程工作和跨部门协作。
2024年十大工程管理软件评测:哪些任务可视化工具能显著提高团队效率?
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
515 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
JavaScript 前端开发
不懂module.exports、exports、export的区别,我惨遭diss
【10月更文挑战第22天】不懂module.exports、exports、export的区别,我惨遭diss
|
自然语言处理 关系型数据库 MySQL
MySQL MATCH 匹配中文 无法查询的问题如何处理?
【8月更文挑战第29天】MySQL MATCH 匹配中文 无法查询的问题如何处理?
621 7
systemback 系统备份与恢复
systemback 系统备份与恢复
247 0
|
机器学习/深度学习 SQL 分布式计算
MaxCompute产品使用问题之动态分区如何多分区写入
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
253 2
Mock 工具使用 - 模拟弱网测试
在移动互联网时代,弱网测试至关重要,尤其面对多样化的网络环境和应用场景,如2G, 3G, 4G及弱信号WiFi。弱网通常指低于3G的网络或弱信号WiFi。Charles工具能方便地模拟不同网络条件,包括带宽、丢包和延迟,以进行功能测试和优化用户体验。通过Proxy -> Throttle Setting启用限制,选择预设或自定义参数(如下载速度、带宽和延迟)进行测试。通过基础模拟和定制设置,确保移动端应用在弱网环境下的稳定性和性能。