【C++】二叉树进阶面试题(上)

目录

1. 二叉树创建字符串

题目

分析

代码

2. 二叉树的分层遍历1

题目

分析

代码

3. 二叉树的分层遍历2

题目

分析

代码

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

题目

分析

代码

5. 二叉树搜索树转换成排序双向链表

题目

分析

代码


1. 二叉树创建字符串

题目

OJ链接

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

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

分析

如下图所示

这道题要求打印出表示二叉树关系的字符串,这样应该很简单,但是又要求省略掉不必要的空括号,这就需要判断什么情况下的括号是不必要的括号,很显然,如果一个结点的左子树为空,但是右子树不为空,这时候代表左子树的那个括号就一定不能省略,在其他情况下则都是可以省略的,根据这些我们可以写出如下代码

代码

class Solution {
public:string tree2str(TreeNode* root) {string ret;if(root==nullptr)return "";ret+=to_string(root->val);
//当左子树不为空if(root->left){ret+="(";ret+=tree2str(root->left);ret+=")";}
//当左子树为空,右子树不为空if(root->right&&root->left==nullptr){ret+="()";}
//当右子树不为空if(root->right){ret+="(";ret+=tree2str(root->right);ret+=")";}return ret;}
};

2. 二叉树的分层遍历1

题目

OJ链接

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

分析

这道题就是对二叉树进行层序遍历,即根据深度来依次遍历,遍历完上一层的所有结点才能访问下一层的。

这时候我们需要一个变量levelsize来帮助我们记录当前深度下一共有多少个结点,来帮助我们能遍历完当前层的所有结点,并且在遍历上一层结点的同时把下一层结点的个数统计出来,依次循环下去达到我们的目的。

代码

class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> vv;if (root == nullptr) {return vv;}// 先记录第一层的结点个数(一定为1)int levelSize = 1;queue<TreeNode*> q;// 将第一层的所有结点插入队列(只有一个根节点)q.push(root);while (!q.empty()) {// 记录当前层的所有结点的值vector<int> v;// 遍历完当前层的所有结点while (levelSize--) {// 获得当前结点并将该节点弹出TreeNode* cur = q.front();q.pop();v.push_back(cur->val);// 将下一层的结点插入到队列if (cur->left) {q.push(cur->left);}if (cur->right) {q.push(cur->right);}}// 刷新levelSize为下一层的结点个数levelSize = q.size();// 将当前层的所有结点的值填入二维数组vv.push_back(v);}return vv;}
};

3. 二叉树的分层遍历2

题目

OJ链接

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

分析

与上一题输出相反,我们可以对上一题得到的二维数组vv进行倒转,即使用reverse函数进行逆置。

在上一题的return vv;前加一个

        reverse(vv.begin(),vv.end());

代码

class Solution {
public:vector<vector<int>> levelOrderBottom(TreeNode* root) {vector<vector<int>> vv;if (root == nullptr) {return vv;}// 先记录第一层的结点个数(一定为1)int levelSize = 1;queue<TreeNode*> q;// 将第一层的所有结点插入队列(只有一个根节点)q.push(root);while (!q.empty()) {// 记录当前层的所有结点的值vector<int> v;// 遍历完当前层的所有结点while (levelSize--) {// 获得当前结点并将该节点弹出TreeNode* cur = q.front();q.pop();v.push_back(cur->val);// 将下一层的结点插入到队列if (cur->left) {q.push(cur->left);}if (cur->right) {q.push(cur->right);}}// 刷新levelSize为下一层的结点个数levelSize = q.size();// 将当前层的所有结点的值填入二维数组vv.push_back(v);}reverse(vv.begin(),vv.end());return vv;}
};

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

题目

OJ链接

分析

这里我们可以找出p和q路径上的所有祖先结点插入栈中,然后pop出栈对p和q路径上的结点依次比较,从而找到最近的公共祖先结点。

代码

class Solution {
public:bool createPath(TreeNode* root, TreeNode* t, stack<TreeNode*>& st){if (root == nullptr)return false;st.push(root);if (root == t)return true;if (createPath(root->left, t, st))return true;if (createPath(root->right, t, st))return true;st.pop();return false;}TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {stack<TreeNode*> p_path;stack<TreeNode*> q_path;//插入p和q路径上的所有结点到栈中createPath(root, p, p_path);createPath(root, q, q_path);//使得两个条路径的结点个数一样while (p_path.size() != q_path.size()){if (p_path.size() > q_path.size())p_path.pop();elseq_path.pop();}//寻找最近的公共结点while (p_path.top()!=q_path.top()){p_path.pop();q_path.pop();}return p_path.top();}
};

5. 二叉树搜索树转换成排序双向链表

题目

OJ链接

分析

如果说可以创建新的结点,那这题比较简单,但是题目要求不能创建新节点,只能调整当前结点的指向来完成双向链表的创建。

代码

class Solution {
public:void order(TreeNode* root, TreeNode*& preNode){if (root == nullptr)return;if (root->left)order(root->left, preNode);root->left = preNode;if (preNode)preNode->right = root;preNode = root;if (root->right)order(root->right, preNode);}TreeNode* Convert(TreeNode* pRootOfTree) {if (pRootOfTree == nullptr)return nullptr;TreeNode* preNode = nullptr;order(pRootOfTree, preNode);TreeNode* head = pRootOfTree;while (head->left){head = head->left;}return head;}
};

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

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

相关文章

使用GitHub API 查询开源项目信息

一、GitHub API介绍 GitHub API 是一组 RESTful API 接口&#xff0c;用于与 GitHub 平台进行交互。通过使用 GitHub API&#xff0c;开发人员可以访问和操作 GitHub 平台上的各种资源&#xff0c;如仓库、提交记录、问题等。 GitHub API 提供了多种功能和端点&#xff0c;以…

昇腾芯片解析:华为自主研发的人工智能处理器全面分析

在当今科技发展的浪潮中&#xff0c;昇腾芯片作为一种新兴的处理器&#xff0c;正引起广泛的关注和讨论。升腾芯片究竟是由哪家公司生产的&#xff1f;这个问题一直困扰着许多人。下面小编将全面介绍、分析升腾芯片的生产商及各类参数、应用&#xff0c;以便读者对其有更全面的…

自学高效备考2025年AMC8数学竞赛:2000-2024年AMC8真题解析

今天继续来随机看五道AMC8的真题和解析&#xff0c;根据实践经验&#xff0c;对于想了解或者加AMC8美国数学竞赛的孩子来说&#xff0c;吃透AMC8历年真题是备考最科学、最有效的方法之一。即使不参加AMC8竞赛&#xff0c;吃透了历年真题600道和背后的知识体系&#xff0c;那么小…

Maven终端命令生成Spring-boot项目并输出“helloworld“

1. 生成项目 mvn archetype:generate填写groupId和artifactId&#xff0c;其余默认即可 2. 修改pom.xml文件 将如下内容放入pom.xml文件内 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artif…

Conda笔记--移动Conda环境后pip使用异常的解决

1--概述 由于各种原因&#xff0c;需要将Anaconda转变为Minicoda&#xff0c;为了保留之前安装的所有环境&#xff0c;直接将anaconda3/envs的所有环境拷贝到Miniconda/envs中&#xff0c;但在使用移动后环境时会出现pip的错误&#xff1a;bad interpreter: No such file or di…

计算机网络-物理层-传输媒体

传输媒体的分类 导向型-同轴电缆 导向型-双绞线 导向型-光纤 非导向型

面试问答总结之Java进阶

文章目录 &#x1f412;个人主页&#x1f3c5;JavaEE系列专栏&#x1f4d6;前言&#xff1a;&#x1f380;注解Annotaion &#xff08;java标注&#xff09;&#x1f415;内置注解&#x1f415;元注解 &#x1f380;对象克隆&#x1f415;如何实现克隆&#x1f415;如何实现深克…

C#,最小代价多边形三角剖分MCPT(Minimum Cost Polygon Triangulation)算法与源代码

1 最小代价多边形三角剖分算法 凸多边形的三角剖分是通过在非相邻顶点&#xff08;角点&#xff09;之间绘制对角线来形成的&#xff0c;这样对角线就不会相交。问题是如何以最小的代价找到三角剖分的代价。三角剖分的代价是其组成三角形的权重之和。每个三角形的重量是其周长…

LLM春招准备(1)

llm排序 GPT4V GPT-4V可以很好地理解直接绘制在图像上的视觉指示。它可以直接识别叠加在图像上的不同类型的视觉标记作为指针&#xff0c;例如圆形、方框和手绘&#xff08;见下图&#xff09;。虽然GPT-4V能够直接理解坐标&#xff0c;但相比于仅文本坐标&#xff0c;GPT-4V在…

蓝桥杯练习题——dp

五部曲&#xff08;代码随想录&#xff09; 1.确定 dp 数组以及下标含义 2.确定递推公式 3.确定 dp 数组初始化 4.确定遍历顺序 5.debug 入门题 1.斐波那契数 思路 1.f[i]&#xff1a;第 i 个数的值 2.f[i] f[i - 1] f[i - 2] 3.f[0] 0, f[1] 1 4.顺序遍历 5.记得特判 …

Web前端---表格和表单

1.表格概述 表格标记&#xff1a;<table></table> 表格标题标记&#xff1a;<caption></caption> 表头&#xff1a;<th></th>------heading 行标记&#xff1a;<tr></tr>-----r是row 列标记&#xff1a;<td></t…

数据可视化原理-腾讯-散点图

在做数据分析类的产品功能设计时&#xff0c;经常用到可视化方式&#xff0c;挖掘数据价值&#xff0c;表达数据的内在规律与特征展示给客户。 可是作为一个产品经理&#xff0c;&#xff08;1&#xff09;如果不能够掌握各类可视化图形的含义&#xff0c;就不知道哪类数据该用…

快速搭建Vue前端框架

快速搭建Vue前端框架 安装Vue Vue官方安装过程:https://cli.vuejs.org/zh/guide/installation.html 二.创建Vue工程 2.2 安装淘宝镜像 安装淘宝镜像&#xff08;会让你安装Vue的速度加快&#xff09;&#xff1a; npm config set registry https://registry.npm.taobao.or…

CMU 10-414/714: Deep Learning Systems --hw0

hw0 宏观上的步骤: softmax loss: 实现softmax loss代码 概念 softmax就是将结果映射到0~1之间,且所有结果相加为1(概率形式)cross-entropy loss就是计算 p ( x ) log ⁡ q ( x ) p(x)\log {q(x)} p(x)logq(x),此值可用于衡量实际输出与期望输出的距离,进而衡量预测模…

Qt 实现橡皮擦拭显示图片

1.简介 在一些游戏中看见类似解密破案的效果&#xff0c;使用手触摸去擦拭图片上的灰尘&#xff0c;然后显示最终的图片&#xff0c;所以也想试试Qt实现的效果。大家有自己想做的效果&#xff0c;都可以尝试。 以下是效果展示图。 可以控制橡皮擦的大小&#xff0c;进行擦拭…

CRMCHAT修复获取客户ip信息,地区信息

CRMCHAT修复获取客户ip信息&#xff0c;地区信息-TP源码网原因&#xff1a; 因pv.sohu.com/cityjson?ieutf-8接口已无法正确获取ip信息&#xff0c;导致后台站点统计无法正确获取用户ip信息&#xff0c;无法获取地区信息 修改 注释掉无用接口地址 修复ip信息 也可以使用&…

NLP评价指标

一、分类任务常见评估&#xff1a; 准确度(Accuracy) 评估预测正确的比例&#xff0c;精确率(Precision) 评估预测正例的查准率&#xff0c;召回率(Recall) 评估真实正例的查全率。如果是多分类&#xff0c;则每个类别各自求P、R最终求平均值。 TP&#xff08;True Positives…

11. Nginx进阶-HTTPS

简介 基本概述 SSL SSL是安全套接层。 主要用于认证用户和服务器&#xff0c;确保数据发送到正确的客户机和服务器上。 SSL可以加密数据&#xff0c;防止数据中途被窃取。 SSL也可以维护数据的完整性&#xff0c;确保数据在传输过程中不被改变。 HTTPS HTTPS就是基于SSL来…

【Unity】Node.js安装与配置环境

引言 我们在使用unity开发的时候&#xff0c;有时候会使用一些辅助工具。 Node.js就是开发中&#xff0c;经常会遇到的一款软件。 1.下载Node.js 下载地址&#xff1a;https://nodejs.org/en 2.安装Node.js ①点击直接点击Next下一步 ②把协议勾上&#xff0c;继续点击…

【lua】lua内存优化记录

这边有一个Unity项目用的tolua&#xff0c; 游戏运行后手机上lua内存占用 基本要到 189M&#xff0c; 之前峰值有200多。 优化点1 加快gc频度&#xff1a; 用uwa抓取的lua内存&#xff0c; 和unity的mono很像&#xff0c;内存会先涨 然后突然gc一下&#xff0c;降下来。 这样…