【二叉树进阶】--- 根据二叉树创建字符串

 Welcome to 9ilk's Code World

       

(๑•́ ₃ •̀๑) 个人主页:        9ilk

(๑•́ ₃ •̀๑) 文章专栏:     数据结构 


从本篇文章开始,博主将分享一些结合二叉树的进阶算法题。


🏠 根据二叉树创建字符串

📌 题目内容

根据二叉树创建字符串

📌 题目解析

本题有几个点需要注意:

  • 题目需要我们按前序遍历去构建字符串,遇到为空的节点用()表示
  • 在不破坏映射的前提下,空括号是可以省略的。比如:当右子树不为空时,左子树为空的时候空括号不能省略,因为这样就分不清这个节点是连在根的左子树还是右子树了。

📌 算法分析

1. 我们将PreOrder()看作一个具有帮我们分别将根-左子树-右子树的值添加进字符串的功能的函数,按照这个顺序进行递归。

2.什么时候需要加括号:a.当右子树不为空的时候,左子树无论是否有节点都是要加上空括号的,

b.当右子树为空时,右子树的空括号是可以省略的。

3.递归终止条件:遇到空节点并停止递归。

4.在C++中添加字符到字符串中,我们直接调用+=就方便许多了。

参考代码:

  void PreOrder(string& str, TreeNode* root){  //叶子节点的括号才能忽略if (root == nullptr)return;// str += to_string(root->val);//访问左子树 右子树和左子树不为空都需要加括号 if (root->left || root->right) //非叶子节点的左为空不能忽略{   str += '(';PreOrder(str, root->left);str += ')';}//访问右子树 if (root->right){str += '(';PreOrder(str,root->right);str += ')';}}string tree2str(TreeNode* root){string str;PreOrder(str, root);return str;}

🏠 二叉树的层序遍历II

📌 题目内容

二叉树的层序遍历II

📌 题目解析

  • 题目要求我们返回的是一个二维数组,二维数组内的每一个一维数组是这个二叉树每一层的结点
  • 最后要我们返回的是从最后一层到第一层的二维数组,但是每一层节点的顺序是从左到右。

📌 算法分析

✏️ 思路一:

1. 我们二叉树的层序遍历是借助一个队列,利用“一父带两娃”的思想(即一个父亲入队的时候,它的两个孩子也一起入队)实现。

2.本道题重点是采用层序遍历的思想,我们无法具体划分出每个节点归属的层次

3.我们可以再开一个队列,用来存每个节点所对应的层次。当一个父亲(层次是h)入队时,那他的两个孩子对应的层次就是h+1;同时当一个节点出队时,他对应高度也对应出

4.为了效率,我们可以先计算总的高度,提前开好二维数组所需要的层数;但是注意resize之后就不要调用push_back,因为push_back会新开空间。

5.我们按上面流程得到的是从上到下的层序遍历,从下往上我们可以使用reverse算法进行逆置

参考代码:

   //求高度int height(TreeNode* root){if (root == nullptr)return 0;int left = height(root->left);int right = height(root->right);return left > right ? left + 1 :right + 1;}vector<vector<int>> levelOrder(TreeNode* root){vector<vector<int>> vv;if(root == nullptr)return vv;int Height = height(root);//预先开好层数空间 vv.resize(Height);queue<TreeNode*> treeq;queue<int> levelq;levelq.push(1);//根节点是第一层treeq.push(root);vv[0].push_back(root->val);while(!treeq.empty()){TreeNode* front = treeq.front();treeq.pop();           int levelsize = levelq.front();levelq.pop();if(front->left)  //一父带两娃的同时也push对应高度{treeq.push(front->left);levelq.push(levelsize+1);vv[levelsize].push_back(front->left->val); //push进对应层数的数组}  if(front->right){treeq.push(front->right);levelq.push(levelsize+1);vv[levelsize].push_back(front->right->val);}  }reverse(vv.begin(),vv.end());return vv;}

✏️ 思路二:

1.了解思路一后,我们发现思路一维护每个结点的层数比较麻烦,我们能否另寻他路,一口气把每层的结点push进数组里?

2.我们用levelsize表示每一层结点个数,假设有颗满二叉树,当根结点入队时顺便此时他的左右结点也顺便入队,此时队列中结点的个数就是2,此时这两个结点对应层数就是2;类似地当第二层的两结点一父带两娃时,此时入队了4个结点,这一层也是有4个结点。因此,每次“一父带两娃”后队列内的结点个数就是他们对应的层数,利用这个levelsize进行一个循环,把这一层的结点都push进对应层的数组内。

动图演示:

参考代码:

class Solution {
public:vector<vector<int>> levelOrderBottom(TreeNode* root){queue<TreeNode*> tq;vector<vector<int>> vv;if(root == nullptr)return vv;tq.push(root);int levelsize = 1; //层数表示了要“一父带两娃”的次数 也就是上一层带入的孩子总个数// vv.push_back(vector<int>({root->val}));vector<int> del = {root->val};vv.push_back(del);while(!tq.empty()) //也可以是levelsize != 0{vector<int> v;while(levelsize--) {TreeNode* front = tq.front();//一父带两娃    tq.pop();if(front->left){tq.push(front->left);v.push_back(front->left->val);  }if(front->right){tq.push(front->right);v.push_back(front->right->val);  }}levelsize = tq.size();if(v.size())vv.push_back(v);}reverse(vv.begin(),vv.end());return vv;}
};

完(๑¯ω¯๑)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从行为面试问题(behavioral questions)看中美程序员差异。

中美程序员在职场中的工作状态和职能、福利等有很大区别&#xff0c;从面试中的BQ轮就可见一斑。 中美程序员的面试轮差异&#xff1f; 国内的面试轮在不同公司间差异很大&#xff0c;但总体的问题类型包含笔试面试&#xff08;算法题、概念题、项目深挖、职业目标、职场文化…

FGUI+TS如何实现数字翻滚

FGUITS如何实现数字翻滚 实现效果如下&#xff1a; 实现步骤&#xff1a; fgui制作组件和特效 fgui制作组件&#xff0c;设置一条竖向数字包含1-9或者小数点符号等&#xff0c;可见区域为一个数字大小&#xff0c;最好可见区域紧贴数字&#xff0c;这样滚动的时候滚动区域范围…

深度学习------------------卷积神经网络(LeNet)

目录 LeNet网络手写的数字识别MNIST总结卷积神经网络&#xff08;LeNet&#xff09; 问题 LeNet网络 手写的数字识别 MNIST ①输入的是&#xff1a;3232的image ②放到一个55的卷积层里面&#xff08;为什么是5&#xff1f;因为32-x128&#xff0c;∴x5&#xff09;&#xff0c…

【教程】Ubuntu给pycharm添加侧边栏快捷方式

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 以下教程不仅限于pycharm&#xff0c;其他软件也是一样操作 1、进入到pycharm的目录&#xff0c;先通过命令行打开pycharm&#xff1a; ./bin/pycharm…

keepalived+haproxy高可用负载均衡集群

简介 使用haproxy制作负载均衡集群&#xff0c;keepalived通过状态检测脚本检测本机haproxy状态&#xff0c;若为离线状态&#xff0c;则会降低该节点的优先级。 实验准备 四台虚拟机&#xff1a;KA1、KA2为keepalivedhaproxy&#xff0c;web1、web2为后端服务器&#xff0c;均…

阿里云-java调用短信服务,第三方接口的开启(傻瓜式教程)

第一步&#xff1a;在浏览器中&#xff0c;搜索阿里云 第二步&#xff1a;打开aly的主页 第三步&#xff1a;在最上方的导航栏中&#xff0c;找到云市场&#xff0c;注意不要点击&#xff0c;会自动有触发悬浮框出现&#xff0c;在悬浮框中找到 短信 第四步&#xff1a;点击 短…

无人机之电池注意事项

1、外场作业时&#xff0c;电池一定要放置在阴凉处&#xff0c;避免太阳直射&#xff1b; 2、刚作业完的电池发热严重时&#xff0c;请降至室温再充电&#xff1b; 3、注意电池状态&#xff0c;一旦发现电池出现鼓包、漏液等现象&#xff0c;必须马上停止使用&#xff1b; 4…

UE5 C++项目的配置

创建项目 首先启动UE5,然后选择要创建的项目&#xff0c;选择c进行创建 创建项目完毕之后&#xff0c;会自动打开visual studio&#xff0c;页面如下图所示 点击总体配置状态的刷新按钮&#xff0c;会自动检测总体的配置状态 一般会在下图所示的两项出现警告 Unreal Engi…

舵机模块学习

舵机是一种根据输入PWM信号占空比来控制输出角度的装置 执行逻辑&#xff1a;PWM信号输入到控制板&#xff0c;给控制版一个指定的目标角度&#xff0c;然后电位器检测输出轴的当前角度&#xff0c;如果大于目标角度&#xff0c;电机反转&#xff0c;小于正转&#xff0c;最终使…

Linux--HTTP协议(http服务器构建)

目录 1.HTTP 协议 2.认识 URL 3.urlencode 和 urldecode&#xff08;编码&#xff09; urlencode&#xff08;URL编码&#xff09; urldecode&#xff08;URL解码&#xff09; 4.HTTP 协议请求与响应格式 4.1HTTP 常见方法&#xff08;三种&#xff09; 5.HTTP 的状态码…

去中心化技术的崛起:探索Web3的新时代

引言&#xff1a; Web3是互联网发展的新阶段&#xff0c;它通过去中心化技术重新定义了数字世界的运作方式。这一新时代不仅带来了技术上的突破&#xff0c;也为社会互动和数据管理开辟了新的前景。本文将深入探讨Web3的核心技术、应用领域、全球影响以及面临的挑战&#xff0…

React状态管理:react-redux和redux-saga(适合由vue转到react的同学)

注意&#xff1a;本文不会把所有知识点都写一遍&#xff0c;并不适合纯新手阅读 首先Redux是一种状态管理方案&#xff0c;本身和react并没有什么联系&#xff0c;redux也可以结合其他框架来用。 react-redux是基于react的一种状态管理实现&#xff0c;他不像vuex那样直接内置在…

Centos 7 升级GCC时遇到 mirrorlist.centos.org; Unknown error“

问题描述 在执行如下操作的时候&#xff0c; yum install devtoolset-9-gcc devtoolset-9-gcc-c devtoolset-9-binutils 出现&#xff1a; 14: curl#6 - "Could not resolve host: mirrorlist.centos.org; Unknown error" 网上搜索了一下&#xff0c;原因是 mir…

全开源智慧停车场微信小程序源码/智能停车系统源码/停车自助缴费系统/停车场管理收费+物业管理+物联网+自助缴费功能

源码简介&#xff1a; 智慧停车场微信小程序源码&#xff0c;全开源智能停车系统源码&#xff0c;停车自助缴费系统&#xff0c;具有停车场管理、停车收费、物业管理、物联网、自助缴费等多种功能。 这是一个全开源的智能停车系统&#xff0c;功能强大。它不仅能帮你管理停车…

YOLO目标检测的单目(多目标测距),使用相机光学模型,支持目标检测模型训练,可输出目标位置和距离信息并可视化

本项目旨在开发一个基于YOLO的目标检测系统&#xff0c;该系统不仅能检测图像中的多个目标&#xff0c;还能利用单目摄像头的图像估计每个目标与摄像头之间的相对距离。系统的核心组成部分包括目标检测、距离估计、模型训练以及结果可视化。 主要功能 目标检测&#xff1a;使用…

后台管理权限自定义按钮指令v-hasPermi

第一步:在src下面建立一个自定义指令文件,放自定义指令方法 permission.js文件: /*** v-hasPermi 操作权限处理*/import store from "/store";export default {inserted(el, binding) {const { value } binding;//从仓库里面获取到后台给的数组const permission s…

【PGCCC】使用 Postgres 递归 CTE 进行图形检索

您是否知道可以将 Postgres 用作某些用例的图形数据库&#xff1f; 假设您有如下图表&#xff1a; 我们可以在 NetworkX 中构建此图&#xff1a; 1import networkx as nx23G nx.Graph()45G.add_edges_from([6 ("A", "B"),7 ("A", "…

Python 安装 PyTorch详细教程

本章教程,介绍如何安装PyTorch,介绍两种安装方式,一种是通过pip直接安装,一种是通过conda方式安装。 一、查看CUDA版本 二、安装PyTorch 1、pip安装方式 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu1162、conda安装方式 …

PHP移动端商城分销全平台全端同步使用

&#x1f4f1;【掌中购物新纪元&#xff1a;探索移动端购物商城系统的无限魅力】&#x1f6cd;️ &#x1f680; 随时随地&#xff0c;购物自由新体验 在这个快节奏的时代&#xff0c;移动端购物商城系统彻底颠覆了传统购物方式&#xff0c;让消费者享受到了前所未有的便捷与…

【Linux】

一.前言 思考1&#xff1a;命令的基本组成 command [-options] [paramter] 说明&#xff1a; command&#xff1a;命令 options&#xff1a;命令选项 paramter&#xff1a;命令的操作对象 []&#xff1a;表示可选 思考2&#xff1a;查阅命令帮助信息 command --help …