当前位置: 首页 > news >正文

【LeetCode二叉树进阶题目】606. 根据二叉树创建字符串,102. 二叉树的层序遍历,107. 二叉树的层序遍历 II

二叉树进阶题目

  • 606. 根据二叉树创建字符串
    • 解题思路及实现
  • 102. 二叉树的层序遍历
    • 解题思路及实现
  • 107. 二叉树的层序遍历 II
    • 解题思路及实现

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

描述

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

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

示例在这里插入图片描述

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

在这里插入图片描述

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

解题思路及实现

在这里插入图片描述

class Solution {
public:string tree2str(TreeNode* root) {if(root == nullptr)return string();string str;str+=to_string(root->val);if(root->left){str+='(';str+=tree2str(root->left);str+=')';}else if(root->right)//走到这里,左一定为空{str+="()";}if(root->right){str+='(';str+=tree2str(root->right);str+=')';}return str;}
};

102. 二叉树的层序遍历

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

示例
在这里插入图片描述

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

解题思路及实现

在这里插入图片描述

class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {queue<TreeNode*> q;vector<vector<int>> vv;int LevelSize=0;if(root){q.push(root);LevelSize=1;}while(!q.empty()){vector<int> v;//一层一层出while(LevelSize--){TreeNode* front=q.front();q.pop();v.push_back(front->val);if(front->left)q.push(front->left);if(front->right)q.push(front->right);} vv.push_back(v);//当前一层出完了,下一层都进队列了,那q.size()就是下一层数据数LevelSize=q.size();}return vv;}
};

107. 二叉树的层序遍历 II

给你二叉树的根节点 root ,返回其节点值 自底向上 的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

示例
在这里插入图片描述

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

解题思路及实现

这道题其实就是上面的变形,大家应该有这个思路。把结果翻转一下就好了。

class Solution {
public:vector<vector<int>> levelOrderBottom(TreeNode* root) {queue<TreeNode*> q;vector<vector<int>> vv;int LevelSize=0;if(root){q.push(root);LevelSize=1;}while(!q.empty()){vector<int> v;//一层一层出while(LevelSize--){TreeNode* front=q.front();q.pop();v.push_back(front->val);if(front->left)q.push(front->left);if(front->right)q.push(front->right);} vv.push_back(v);//当前一层出完了,下一层都进队列了,那q.size()就是下一层数据数LevelSize=q.size();}reverse(vv.begin(),vv.end());return vv;}
};

相关文章:

  • docker network容器网络通信
  • Arrays类讲解
  • 使用bard分析视频内容
  • 3、点亮一个LED
  • Redis的性能,哨兵模式,集群,
  • Selenium 4.11 正式发布--再也不用手动更新chrome driver 了
  • 发挥云计算潜力:Amazon Lightsail 与 Amazon EC2 的综述
  • Spring Boot单元测试
  • Qt 软件调试(一) Log日志调试
  • 腾讯云 小程序 SDK对象存储 COS使用记录,原生小程序写法。
  • 初学vue3与ts:路由跳转带参数
  • 【Spark源码分析】事件总线机制分析
  • 【自动化测试】拍照与闪光灯联动测试
  • 大数据Doris(二十八):Routine Load查看和修改作业
  • mac电脑文件比较工具 UltraCompare 中文for mac
  • Effective Java 笔记(一)
  • exports和module.exports
  • HTML中设置input等文本框为不可操作
  • If…else
  • java8-模拟hadoop
  • Java到底能干嘛?
  • JS函数式编程 数组部分风格 ES6版
  • Swoft 源码剖析 - 代码自动更新机制
  • win10下安装mysql5.7
  • 从零开始的无人驾驶 1
  • 多线程事务回滚
  • 使用putty远程连接linux
  • nb
  • Hibernate主键生成策略及选择
  • 选择阿里云数据库HBase版十大理由
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • # 透过事物看本质的能力怎么培养?
  • (003)SlickEdit Unity的补全
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (翻译)terry crowley: 写给程序员
  • (分布式缓存)Redis哨兵
  • (转)LINQ之路
  • .NET 设计一套高性能的弱事件机制
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .NET框架
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • .Net中间语言BeforeFieldInit
  • @DataRedisTest测试redis从未如此丝滑
  • @EnableAsync和@Async开始异步任务支持
  • @selector(..)警告提示
  • [AIGC] Java 和 Kotlin 的区别
  • [AIGC] 如何建立和优化你的工作流?
  • [HarmonyOS]第一课:从简单的页面开始
  • [IE编程] WebBrowser控件中设置页面的缩放
  • [Java]快速入门二叉树,手撕相关面试题
  • [java基础揉碎]关系运算符(比较运算符)逻辑运算符赋值运算符三元运算符运算符的优先级
  • [LeetCode] 178. 分数排名