【刷题记录】关于二叉树的OJ题(上)

简介: 【刷题记录】关于二叉树的OJ题(上)

1.根据二叉树创建字符串


题目链接:606. 根据二叉树创建字符串 - 力扣(LeetCode)

题干:

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

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

示例 1:

cons1-tree.jpg

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

示例 2:

cons2-tree.jpg

输入:root = [1,2,3,null,4]
输出:"1(2()(4))(3)"
解释:和第一个示例类似,但是无法省略第一个空括号对,否则会破坏输入与输出一一映射的关系。

题目分析:

这是一道力扣简单题,显而易见使用先序遍历即可,但是这里需要注意到的点就是,用括号把子树括起来这一点,需要我们着重考虑一下。因为其中有的情况要省略空括号,有的情况不能省略。分析题目可知,当该节点左子树为nullptr,并且右子树有值时不能省略


代码实现:

class Solution {
public:
    string tree2str(TreeNode* root) {
    if(root == nullptr)//当树为空树的时候,遍历之后的结果是空字符串
            return string();
        string str;//创建字符串保存结果
        str += to_string(root->val);//线序遍历,首先把根节点的值放进str,这里需要把val的类型转换成string类型才能追加
        //先序遍历,首先走左子树,然后走右子树
        if(root->left)//左子树不为空时,先序遍历左子树,然后把左子树的字符串加上括号追加到str上
        {
            str += '(';
            str += tree2str(root->left);
            str += ')';
        }
        else if(root->right)//左子树为空,且右子树不为空时
        {
            //此时左子树的空括号不能省略
            str += "()";
        }
        if(root->right)//右子树不为空时,先序遍历右子树
        {
            str += '(';
            str += tree2str(root->right);
            str += ')';            
        }
        return str;
    }
};

image-20230506145824561.png


2.二叉树的层序遍历


题目链接:102. 二叉树的层序遍历 - 力扣(LeetCode)

题干:

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

示例1

tree1.jpg

输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]

示例二

输入:root = [1]
输出:[[1]]

示例三

输入:root = []
输出:[]


题目分析:


二叉树的层序遍历,我们需要借助一下队列的数据结构,将每一层的节点放进队列中,然后需要在访问当前层节点的时候拿到当前节点的子节点,否则后面就找不到子节点了。所以思路就是首先非空节根节点入队列,然后每次出队列时,把该节点的子节点依次入队列,这要就能达到层序的目的,看起来很完美,但是注意一下题目示例,需要我们按照每层节点存放在一个单独的vector中,这就产生了一个问题:怎么判断当前节点是第几层的?仔细分析可知,队列中存放的节点只有两种可能:1.只有当前节点所在层数的节点;2.有当前节点所在层节点和下一层的部分节点,那我们采用一个变量存放当前层的节点个数,然后每当出一个节点就自减,直到为0时,队列中存放的节点个数就是下一层的节点个数,通过这个变量来控制存入第几个vector即可。


代码实现:

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> vv;
        queue<TreeNode*> q;
        int levelSize = 0;//存放当前层的节点个数
        if(root)
        {
            q.push(root);
            levelSize = 1;
        }
        while(!q.empty())
        {
            vector<int> v;//存放每一层的值,一层一层push_back到vv中
            while(levelSize--)
            {
                TreeNode* top = q.front();
                q.pop();
                v.push_back(top->val);
                if(top->left)
                    q.push(top->left);
                if(top->right)
                    q.push(top->right);
            }
            levelSize = q.size();
            vv.push_back(v);
        }
        return vv;
    }
};


image-20230506152450991.png

拓展与补充:107. 二叉树的层序遍历 II - 力扣(LeetCode)

这是上一道题的扩展,让我们自低向上层序遍历,这里有一个最简单的办法就是按照上述的代码走一遍,然后在return之前reverse一下即可。

相关文章
|
4天前
|
云安全 人工智能 自然语言处理
|
8天前
|
人工智能 Java API
Java 正式进入 Agentic AI 时代:Spring AI Alibaba 1.1 发布背后的技术演进
Spring AI Alibaba 1.1 正式发布,提供极简方式构建企业级AI智能体。基于ReactAgent核心,支持多智能体协作、上下文工程与生产级管控,助力开发者快速打造可靠、可扩展的智能应用。
800 17
|
11天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
805 59
Meta SAM3开源:让图像分割,听懂你的话
|
2天前
|
人工智能 安全 小程序
阿里云无影云电脑是什么?最新收费价格个人版、企业版和商业版无影云电脑收费价格
阿里云无影云电脑是运行在云端的虚拟电脑,分企业版和个人版。企业版适用于办公、设计等场景,4核8G配置低至199元/年;个人版适合游戏、娱乐,黄金款14元/月起。支持多端接入,灵活按需使用。
236 164
|
9天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
336 116
|
2天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
368 3
|
6天前
|
弹性计算 搜索推荐 应用服务中间件
阿里云服务器租用价格:一年、1小时及一个月收费标准及优惠活动参考
阿里云服务器优惠汇总:轻量应用服务器200M带宽38元/年起,ECS云服务器2核2G 99元/年、2核4G 199元/年,4核16G 89元/月,8核32G 160元/月,香港轻量服务器25元/月起,支持按小时计费,新老用户同享,续费同价,限时秒杀低至1折。
406 166