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

相关二叉树进阶面试题的讲解?看这一篇足矣

引子:我们在之前学过c语言的二叉树,但是c++来做更好!本期要讲的题目如下(其实有点拖欠了,很久之前,就想写这个了,今天终于克服自己的欲望,达成了这个愿望)

1, 二叉树创建字符串

思路:基于前序遍历,考虑括号的是否可删除情况!如果左为空,但是右不为空,则不能删除,否则不能确定原先顺序!其他括号直接删掉

代码:

class Solution {
public:string tree2str(TreeNode* root) {string answer;if(root==nullptr)return answer;answer+=to_string(root->val);if(root->left!=nullptr ||root->right){answer+='(';answer+=tree2str(root->left);answer+=")";}//if(root->right)if(root->right!=nullptr){answer+='(';answer+=tree2str(root->right);answer+=")";}return answer;}
};

2, 二叉树的分层遍历1

思路:借助每一次插入数组size就是每一层的元素个数,每一层数据存储在一个一维顺序表中,

然后利用queue队列来进行临时工具过度

代码:

class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> answer;if (root == nullptr) {return answer;}size_t size = 0;queue<TreeNode*> h;if (root) {h.push(root);size = 1;}while (size) {vector<int> c;while (size--) {TreeNode* front = h.front();h.pop();c.push_back(front->val);if (front->left) {h.push(front->left);}if (front->right) {h.push(front->right);}}size = h.size();answer.push_back(c);}return answer;}
};

3, 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先

思路:观察特征,发现最近的公共祖先是p,q在二侧,直接进行判断就行

或利用二条路径的相交点就是最近的公共祖先

代码:

class Solution {
public:bool is_intree(TreeNode* root, TreeNode* x) {if (root == nullptr) {return false;}return root == x || is_intree(root->left, x) ||is_intree(root->right, x);}TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if (root == nullptr) {return nullptr;}if (root == q || root == p) {return root;}bool qleft = is_intree(root->left, q);bool qright = !qleft;bool pleft = is_intree(root->left, p);bool pright = !pleft;if (qleft && pright || qright && pleft) {return root;} else if (qleft && pleft) {return lowestCommonAncestor(root->left, p, q);} else {return lowestCommonAncestor(root->right, p, q);}}
};

4, 二叉树搜索树转换成排序双向链表

思路:进行遍历的同时修改指向,可以有一个前驱节点,提前知道自己的未来是什么,或知道后面指向那里,再进行left等赋予节点

代码:

class Solution {public:// TreeNode* Left(TreeNode*t)// {//  while(t->left)//  {//      t=t->left;//  }//  return t;// }void INOrder(TreeNode* cur, TreeNode*& prev) {if (cur == nullptr) {return;}INOrder(cur->left, prev);cur->left = prev;if (prev) {prev->right = cur;}prev = cur;INOrder(cur->right, prev);}TreeNode* Convert(TreeNode* pRootOfTree) {//TreeNode*head=Left(pRootOfTree);if (pRootOfTree == nullptr) {return nullptr;}TreeNode* prev = nullptr;INOrder(pRootOfTree, prev);TreeNode*head=pRootOfTree;while(head->left){head=head->left;}while(prev!=head){prev=prev->left;}// prev->right=head;// head->left=prev;return prev;}
};

5. 根据一棵树的前序遍历与中序遍历构造二叉树

思路:前序:根左右,中序:左根右;在inoreder里面找根节点,以根节点位置以左是左子树,以右为右子树!递归实现

代码:

class Solution {
public:TreeNode* answer(vector<int>& preorder, vector<int>& inorder, int& t,int lefti, int righti) {if (lefti>righti) {return nullptr;}TreeNode* root = new TreeNode(preorder[t]);int v = lefti;while (v <= righti) {if (inorder[v] == preorder[t]) {break;} else {v++;}}t++;root->left = answer(preorder, inorder, t, lefti, v - 1);root->right = answer(preorder, inorder, t, v + 1, righti);return root;}TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {int i = 0;return answer(preorder, inorder, i, 0, inorder.size() - 1);}
};

6. 二叉树的前序遍历,非递归迭代实现

思路:利用栈的特点,先遍历左节点,在找左节点的右子树或右节点,栈为空或cur=nullptr为结束条件

代码:

class Solution {
public:vector<int> preorderTraversal(TreeNode* root) {stack<TreeNode*> h;vector<int> answer;TreeNode*cur=root;while(cur || !h.empty()){while(cur){h.push(cur);answer.push_back(cur->val);cur=cur->left;}TreeNode* top=h.top();h.pop();cur=top->right; }return answer;}
};

希望帮到大家,其他的题知识大同小异!

相关文章:

相关二叉树进阶面试题的讲解?看这一篇足矣

引子&#xff1a;我们在之前学过c语言的二叉树&#xff0c;但是c来做更好&#xff01;本期要讲的题目如下(其实有点拖欠了&#xff0c;很久之前&#xff0c;就想写这个了&#xff0c;今天终于克服自己的欲望&#xff0c;达成了这个愿望&#xff09; 1&#xff0c; 二叉树创建字…...

Nginx部署前端Vue项目的深度解析

目录 一、准备工作 1.1 开发环境 1.2 服务器环境 1.3 Nginx安装 二、构建Vue项目 三、上传静态文件到服务器 四、配置Nginx 五、测试并重新加载Nginx 六、访问Vue应用 七、高级配置 7.1 启用HTTPS 7.2 启用Gzip压缩 7.3 缓存控制 八、常见问题与解决方案 8.1 40…...

PHP一站式解决方案高级房产系统小程序源码

一站式解决方案&#xff0c;高级房产系统让房产管理更轻松 &#x1f3e0;【开篇&#xff1a;告别繁琐&#xff0c;迎接高效房产管理新时代】&#x1f3e0; 你是否还在为房产管理的繁琐流程而头疼&#xff1f;从房源录入、客户咨询到合同签订、售后服务&#xff0c;每一个环节…...

轻量级模型解读——EfficientNet系列

EfficientNet自2019年谷歌提出以来&#xff0c;经历了三个版本&#xff0c;2019EfficientNet ——> 2020EfficientNet-Lite——> 2021EfficientNetv2 文章目录 1、EfficientNet2、EfficientNetv23、EfficientNet-Lite 对于EfficientNet和EfficientNetv2的解读可见另外两篇…...

深入浅出SRS—RTMP实现

RTMP 直播是 SRS 最典型的使用场景&#xff0c;客户端使用 RTMP 协议向 SRS 推流&#xff0c;使用 RTMP 协议从 SRS 拉流&#xff0c;SRS 作为一个 RTMP 直播服务器实现媒体的转发。同时&#xff0c;RTMP 是 SRS 的中转协议&#xff0c;其他协议之间的互通需要先转为 RTMP&…...

睿赛德科技携手先楫共创RISC-V生态|RT-Thread EtherCAT主从站方案大放异彩

日前&#xff0c;在先楫HPM6E00技术日上&#xff0c;睿赛德科技&#xff08;RT-Thread&#xff09;向广大工业用户展示了多年来双方在RISC-V生态领域的合作历程和成果&#xff0c;同时睿赛德科技携手先楫半导体首次推出了基于HPM6800处理器的EtherCAT主站解决方案&#xff0c;吸…...

【Cesium实体创建】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 Cesium目录 前言一、Cesium二、点 线 实体1.点实体2.线实体 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;随着人工智能的不…...

为何一些包的Priority在apt-cache和deb文件当中的不一样

最近遇到一些问题&#xff0c;调查的时候发现是一些包的Priority在apt-cache和deb文件当中的不一样导致的&#xff0c;复现步骤如下&#xff1a; $ apt update $ apt download whiptail $ dpkg-deb -e whiptail_0.52.23-1b1_amd64.deb $ cat control | grep Prio Priority: op…...

CRUD的最佳实践,联动前后端,包含微信小程序,API,HTML等(三)

关说不练假把式&#xff0c;在上一&#xff0c;二篇中介绍了我心目中的CRUD的样子 基于之前的理念&#xff0c;我开发了一个命名为PasteTemplate的项目&#xff0c;这个项目呢后续会转化成项目模板&#xff0c;转化成项目模板后&#xff0c;后续需要开发新的项目就可以基于这…...

nvidia-cuda-tensorrt-cudnn下载网站

tensorrt:https://developer.nvidia.com/tensorrt/download cudnn:https://developer.nvidia.com/rdp/cudnn-archive cuda:https://developer.nvidia.com/cuda-toolkit-archive...

GitLab 是什么?GitLab使用常见问题解答

GitLab 是什么 GitLab是由GitLab Inc.开发&#xff0c;使用MIT许可证的基于网络的Git仓库管理工具开源项目&#xff0c;且具有wiki和issue跟踪功能&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来的web服务。 ​GitLab 是由 GitLab Inc.开发&#xff0c…...

数字时代,寻找新的生意增长点之前要做什么准备?

要做好最基础也最繁复的数据管理。 在竞争日益激烈的快消市场中&#xff0c;企业面临前所未有的挑战与压力。在这种高压环境下&#xff0c;数字化转型不再仅仅是选择&#xff0c;而是企业探索新的业务增长点、保持竞争优势的关键战略。然而&#xff0c;随着企业数字化进程的加…...

使用Python本地搭建http.server文件共享服务并实现公网环境远程访问——“cpolar内网穿透”

前言 本文主要介绍如何在Windows系统电脑上使用python这样的简单程序语言&#xff0c;在自己的电脑上搭建一个共享文件服务器&#xff0c;并通过cpolar创建的公网地址&#xff0c;打造一个可以随时随地远程访问的私人云盘。 数据共享作为和连接作为互联网的基础应用&#xff…...

STM32——Flash闪存

以上部分&#xff0c;主存储器&#xff1a;程序存储器&#xff1b; 启动程序代码&#xff1a;系统存储器&#xff1b; 用户选择字节&#xff1a;选项字节 以下是闪存的管理员&#xff0c;用于擦除和读写的地址 C8T6一共64K&#xff0c;主存储器为64页 以下是整体框图&#x…...

python科学计算:NumPy 数组的高级操作

1 数组的形状变换 NumPy 提供了多种方法来改变数组的形状。这些方法不会改变数组的内容&#xff0c;而是重新组织数据的排列方式。 1.1 reshape() 函数 reshape() 是最常用的形状变换函数&#xff0c;它可以改变数组的形状&#xff0c;前提是变换后的总元素数量与原数组一致…...

【补-网络安全】日常运维(二)终端端口占用排查

文章目录 一、利用ipconfig、netstat 命令行统计二 、策略封禁IP 引言:检查频繁,第一步我们梳理完资产,第二步应该对资产终端进行一个排查,诊断把脉,了解清楚系统的端口占用及开放情况 一、利用ipconfig、netstat 命令行统计 1.先用ipconfig定位该终端的IP地址 2.明确IP地址后…...

设计模式之适配器模式:软件世界的桥梁建筑师

一、什么是适配器模式 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff08;Structural Pattern&#xff09;&#xff0c;通过将类的接口转换为客户期望的另一个接口&#xff0c;适配器可以让不兼容的两个类一起协同工作。其核心思想是通过一个…...

Java 入门指南:Java 并发编程 —— Fork/Join 框架 实现任务的拆分与合并

Fork/Join Fork/Join 是Java并发编程中的一个框架&#xff0c;用于解决大型任务的并行执行问题。它于 Java 7中引入&#xff0c;旨在简化对多核处理器上可并行执行任务的开发。 Fork/Join 框架基于分治&#xff08;divide and conquer&#xff09;的设计思想。它将大型任务划…...

token过期时间分平台(web和app)设置方法

token分平台设置方法 本文介绍了Spring下的登录和鉴权机制的主要方法以及 token认证的主要流程&#xff0c;并介绍在spring中web端和APP端设置不同token过期时间的实现方法。主要基于SpringBootspringSecurityJWT框架实现。 一、应用场景 同一系统的跨平台操作&#xff0c;基于…...

[000-01-008].Seata案例应用

业务说明&#xff1a;这里我们创建三个服务&#xff0c;一个订单服务&#xff0c;一个库存服务&#xff0c;一个账户服务。当用户下单时&#xff0c;会在订单服务中创建一个订单&#xff0c;然后通过远程调用库存服务来扣减下单商品的库存&#xff1b;再通过远程调用账户服务来…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...