二叉树题目:根据二叉树创建字符串

news2024/12/23 8:47:48

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
  • 解法一
    • 思路和算法
    • 代码
    • 复杂度分析
  • 解法二
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:根据二叉树创建字符串

出处:606. 根据二叉树创建字符串

难度

3 级

题目描述

要求

给你二叉树的根结点 root \texttt{root} root,使用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串,并返回。

省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。

示例

示例 1:

示例 1

输入: root   =   [1,2,3,4] \texttt{root = [1,2,3,4]} root = [1,2,3,4]
输出: "1(2(4))(3)" \texttt{"1(2(4))(3)"} "1(2(4))(3)"
解释:原始字符串是 "1(2(4)())(3())" \texttt{"1(2(4)())(3())"} "1(2(4)())(3())",但是需要省略所有不必要的空括号对。结果是 "1(2(4))(3)" \texttt{"1(2(4))(3)"} "1(2(4))(3)"

示例 2:

示例 2

输入: root   =   [1,2,3,null,4] \texttt{root = [1,2,3,null,4]} root = [1,2,3,null,4]
输出: "1(2()(4))(3)" \texttt{"1(2()(4))(3)"} "1(2()(4))(3)"
解释:和第一个示例相似,除了不能省略第一个对括号来中断输入和输出之间的一对一映射关系。

数据范围

  • 树中结点数目在范围 [1,   10 4 ] \texttt{[1, 10}^\texttt{4}\texttt{]} [1, 104]
  • -1000 ≤ Node.val ≤ 1000 \texttt{-1000} \le \texttt{Node.val} \le \texttt{1000} -1000Node.val1000

解法一

思路和算法

这道题要求将二叉树按照前序遍历的顺序转换成字符串。由于二叉树的前序遍历是一个递归的过程,因此将二叉树按照前序遍历的顺序转换成字符串也可以使用递归实现。

递归的终止条件是当前结点为空,此时返回空字符串。其余情况下,首先将当前结点值拼接到字符串中,然后分别判断左子树和右子树是否为空,执行相应的操作。

  • 如果左子树和右子树都为空,则当前结点是叶结点,将字符串返回。

  • 如果左子树不为空且右子树为空,则对左子结点调用递归,将左子树转换成字符串并拼接到当前结点为根结点的子树对应的字符串中,左子树对应的字符串前后需要加上括号。此时不需要将右子树转换成字符串。

  • 如果右子树不为空,则依次对左子结点和右子结点调用递归,将左子树和右子树分别转换成字符串并拼接到当前结点为根结点的子树对应的字符串中,左子树和右子树对应的字符串前后都需要加上括号。此时无论左子树是否为空,都需要将左子树转换成字符串。

代码

class Solution {
    public String tree2str(TreeNode root) {
        if (root == null) {
            return "";
        }
        StringBuffer sb = new StringBuffer();
        sb.append(root.val);
        if (root.left == null && root.right == null) {
            return sb.toString();
        }
        if (root.right == null) {
            sb.append('(');
            sb.append(tree2str(root.left));
            sb.append(')');
        } else {
            sb.append('(');
            sb.append(tree2str(root.left));
            sb.append(')');
            sb.append('(');
            sb.append(tree2str(root.right));
            sb.append(')');
        }
        return sb.toString();
    }
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。每个结点都被访问一次,每个结点转换成字符串的时间都是 O ( 1 ) O(1) O(1)

  • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。空间复杂度主要是递归调用的栈空间和转换成的字符串空间,递归调用的栈空间取决于二叉树的高度,最坏情况下是 O ( n ) O(n) O(n),字符串空间取决于结点数,是 O ( n ) O(n) O(n)

解法二

思路和算法

也可以使用迭代的方法将二叉树转换成字符串。使用迭代的方法,需要使用栈存储结点。

由于将二叉树转换成字符串需要遵循前序遍历的顺序,因此可以按照前序遍历的方法实现。字符串中,除了每个结点值以外,还需要在正确的位置添加括号。对于左括号,只需要在每个结点值的前面添加左括号即可。更复杂的是另外两种情况:一是当左子结点为空时需要添加空括号对,二是当结点访问结束时如何添加右括号。

对于第一种情况,在访问一个结点之后,如果发现该结点的左子结点为空且右子结点不为空,则需要添加空括号对。

对于第二种情况,需要考虑括号的作用。左括号表示进入更深的一层,右括号表示回到上一层,因此在判断如何添加右括号时,应考虑当前访问的结点和下一个待访问的结点之间的层数之差。为了实现这一点,需要对每个结点维护层数,因此需要使用另一个栈存储每个结点的层数。规定根结点的层数是 0 0 0,对于存在父结点和子结点关系的两个结点,子结点的深度是父结点的深度加 1 1 1

根据前序遍历的迭代实现,每次访问一个结点之后将当前结点移动到其左子结点,直到当前结点为空。此时将一个结点出栈,如果出栈结点的右子结点不为空,则出栈结点的右子结点即为下一个待访问的结点,如果出栈结点的右子结点为空,则继续将一个结点出栈,重复上述操作。因此当前层数(即上一个访问的左子结点的层数)和出栈结点的层数之差即为需要添加的右括号数量,添加右括号的同时将当前层数相应减少,直到当前层数等于出栈结点的层数。

遍历结束之后,层数需要恢复到访问根结点之前。由于根结点的层数是 0 0 0,因此需要添加的右括号数量为当前层数加 1 1 1

添加最后的右括号之后,整个字符串的最外层是一对括号,包围整个二叉树转换成的字符串。由于返回值的要求是没有最外层的一对括号,因此去掉最外层的一对括号即可得到二叉树转换成的字符串。

代码

class Solution {
    public String tree2str(TreeNode root) {
        StringBuffer sb = new StringBuffer();
        Deque<TreeNode> nodeStack = new ArrayDeque<TreeNode>();
        Deque<Integer> levelStack = new ArrayDeque<Integer>();
        TreeNode node = root;
        int level = -1;
        int rightCount = 0;
        while (!nodeStack.isEmpty() || node != null) {
            while (node != null) {
                level++;
                sb.append('(');
                sb.append(node.val);
                nodeStack.push(node);
                levelStack.push(level);
                node = node.left;
            }
            TreeNode parent = nodeStack.pop();
            int parentLevel = levelStack.pop();
            node = parent.right;
            if (node != null && parent.left == null) {
                sb.append("()");
                rightCount++;
            }
            while (level > parentLevel) {
                sb.append(')');
                level--;
            }
        }
        while (level > -1) {
            sb.append(')');
            level--;
        }
        return sb.substring(1, sb.length() - 1);
    }
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。每个结点都被访问一次,每个结点转换成字符串的时间都是 O ( 1 ) O(1) O(1)

  • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。空间复杂度主要是栈空间和转换成的字符串空间,栈空间取决于二叉树的高度,最坏情况下是 O ( n ) O(n) O(n),字符串空间取决于结点数,是 O ( n ) O(n) O(n)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/861066.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Git 代码分支规范

目的 俗话说&#xff1a;没有规矩&#xff0c;不成方圆。遵循一个好的规章制度能让你的工作事半功倍。同时也可以展现出你做事的认真的态度以及你的专业性&#xff0c;不会显得杂乱无章&#xff0c;管理困难。Git分支规范也是一样。当遵循了某种约定的Git分支&#xff0c;在代…

欧拉公式的证明-泰勒展开法

欧拉公式 欧拉公式在理工科有着广泛的应用和影响。 特别地&#xff0c;当时&#xff0c;&#xff0c;巧妙地将自然对数底数 &#xff0c;圆周率 &#xff0c;虚数单位 &#xff0c; 写进一个公式。 证明 由泰勒公式&#xff1a; 即 提取奇偶次项&#xff1a; 即 补充&#xf…

Michael.W基于Foundry精读Openzeppelin第23期——ERC165Checker.sol

Michael.W基于Foundry精读Openzeppelin第23期——ERC165Checker.sol 0. 版本0.1 ERC165Checker.sol 1. 目标合约2. 代码精读2.1 supportsERC165InterfaceUnchecked(address account, bytes4 interfaceId)2.2 supportsERC165(address account)2.3 supportsInterface(address acc…

Docker一键部署项目,无需登录XShell

文章目录 一键部署项目Docker手动部署SpringBoot项目编写docker部署的脚本文件script.sh 脚本内容 特别注意&#xff01;编写dockerfiledockerfile 文件内容 上传后端服务的jar包到服务器中执行 script 脚本部署后端服务 自动部署SpringBoot项目引入jsch依赖编写jsch工具类执行…

C# byte[]与Bitmap互转

首先先观察一下本地bmp图像结构(参考&#xff1a; https://blog.csdn.net/qq_37872392/article/details/124710600)&#xff1a; 可以看到bmp图像结构除了纯图像像素点位信息&#xff0c;还有一块未用空间(OffSet)。 所以如果需要得到图像所有数据进行转换&#xff0c;则可以使…

MySQL_SQL性能分析

SQL执行频次 语法&#xff1a; SHOW GLOBAL STATUS LIKE COM_类型; COM_insert; 插入次数 com_delete; 删除次数 com_update; 更新次数 com_select; 查询次数 com_______; 注意&#xff1a;通过语法&#xff0c;可以查询到数据库的实际状态&#xff0c;就可以知道数据库是以增删…

macos搭建appium-iOS自动化测试环境

目录 准备工作 安装必需的软件 安装appium 安装XCode 下载WDA工程 配置WDA工程 搭建appiumwda自动化环境 第一步&#xff1a;启动通过xcodebuild命令启动wda服务 分享一下如何在mac电脑上搭建一个完整的appium自动化测试环境 准备工作 前期需要准备的设备和账号&…

【独立版】新零售社区团购电商系统生鲜水果商城兴盛优选十荟团源码

【独立版】新零售社区团购电商系统生鲜水果商城兴盛优选十荟团源码

DNSlog注入(利用DNSlog平台将SQL盲注变成回显注入)

前言什么是UNC什么是DNSlog注入DNSlog注入的条件防止DNSlog注入的几个措施 sqli-labs试验 前言 前几天面试的时候&#xff0c;面试官问我知不知道OOB&#xff08;带外数据&#xff09;。 当时我蒙了&#xff0c;确实没听说过这个东西&#xff0c;然后面试官告诉我原来dnslog注入…

机器人CPP编程基础-04输入Input

机器人CPP编程基础-03变量类型Variables Types ……AI…… C #include<iostream> // 引入iostream库&#xff0c;这个库包含了对输入/输出进行操作所需的函数和对象 using namespace std; // 使用命名空间std&#xff0c;这样我们就可以直接使用std中的名字&#xff0c…

设定嵌入式linux系统的用户名和密码

遇到一个问题&#xff0c;板子上电后&#xff0c;串口可以正常输入命令行&#xff0c;而且不需要密码&#xff0c;用户名就是root &#xff0c;因为没有设置密码&#xff0c;但是SSH登录时用户名输入root&#xff0c;密码直接敲回车键也就是不输入密码竟然是错误的&#xff0c;…

一文带你入门Nacos:从安装到实例分析

目录 一、安装和配置 1.1 下载安装包 1.2 解压 1.3 端口配置 1.4 启动 1.5 访问 二、服务注册到nacos 2.1 引入依赖 2.2 配置nacos地址 2.3 重启 三、服务分级存储模型 3.1 给user-service配置集群 3.2 同集群优先的负载均衡 1&#xff09;给order-service配…

勘探开发人工智能技术:机器学习(3)

0 提纲 4.1 logistic回归 4.2 支持向量机(SVM) 4.3 PCA 1 logistic回归 用超平面分割正负样本, 考虑所有样本导致的损失. 1.1 线性分类器 logistic 回归是使用超平面将空间分开, 一边是正样本, 另一边是负样本. 因此, 它是一个线性分类器. 如图所示, 若干样本由两个特征描…

竞赛项目 深度学习疲劳驾驶检测 opencv python

文章目录 0 前言1 课题背景2 实现目标3 当前市面上疲劳驾驶检测的方法4 相关数据集5 基于头部姿态的驾驶疲劳检测5.1 如何确定疲劳状态5.2 算法步骤5.3 打瞌睡判断 6 基于CNN与SVM的疲劳检测方法6.1 网络结构6.2 疲劳图像分类训练6.3 训练结果 7 最后 0 前言 &#x1f525; 优…

Python爬虫 爬取图片

在我们日常上网浏览网页的时候&#xff0c;经常会看到一些好看的图片&#xff0c;我们就希望把这些图片保存下载&#xff0c;或者用户用来做桌面壁纸&#xff0c;或者用来做设计的素材。 我们最常规的做法就是通过鼠标右键&#xff0c;选择另存为。但有些图片鼠标右键的时候并没…

竞赛项目 深度学习的视频多目标跟踪实现

文章目录 1 前言2 先上成果3 多目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的视频多目标跟踪实现 …

LabVIEW对并行机器人结构进行建模仿真

LabVIEW对并行机器人结构进行建模仿真 为了对复杂机器人结构的数学模型进行建模、搜索、动画和验证&#xff0c;在工业机器人动态行为实验室中&#xff0c;设计并实现了具有五个自由度的单臂型机器人。在研究台上可以区分以下元素&#xff1a;带有直流电机和编码器的机器人;稳…

竞赛项目 深度学习花卉识别 - python 机器视觉 opencv

文章目录 0 前言1 项目背景2 花卉识别的基本原理3 算法实现3.1 预处理3.2 特征提取和选择3.3 分类器设计和决策3.4 卷积神经网络基本原理 4 算法实现4.1 花卉图像数据4.2 模块组成 5 项目执行结果6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &a…

安卓应用面试

Cordova 说明&#xff1a;一个移动框架&#xff0c;将HTML&#xff0c;CSS&#xff0c;JS封装为原生APP(hybird) 优点&#xff1a;跨平台&#xff0c;利于移植&#xff0c;能利用HTML5的各种特性&#xff0c;快速开发&#xff0c;成本低 缺点&#xff1a;不能使用设备的所以…

后端人员如何快速上手vue

一、环境搭建 了解更多vue-cli 官网地址:https://cli.vuejs.org/zh/guide/browser-compatibility.html 前提 1.安装node(js代码的运行环境)、npm、cnpm/yarn&#xff1b; nodejs官网&#xff1a;https://nodejs.org/en cnpm安装&#xff1a;https://www.python100.com/htm…