C++ 二叉树OJ题

💓博主CSDN主页:麻辣韭菜-CSDN博客💓

⏩专栏分类:C++知识分享⏪

🚚代码仓库:C++高阶🚚

🌹关注我🫵带你学习更多C++知识
  🔝🔝

前言

C++二叉搜索树 这篇讲解了搜索二叉树的实现的,本篇从实战出发,让大家更好的掌握和理解二叉树的!!!!



1. 二叉树创建字符串。606. 根据二叉树创建字符串 - 力扣(LeetCode)

 

找出规律,我们就好办了 直接代码演示。 

class Solution {
public:string tree2str(TreeNode* root) {if(root == nullptr) //根为空 直接返回空串!return "";string str  = to_string(root->val); //外面解释这个函数//结合 刚才的3点总结 左右都为空不加括号,左为空是要加括号的。 if(root->left || root->right){str += '(';str += tree2str(root->left);str += ')';}if(root->right){str += '(';str += tree2str(root->right);str += ')';}return str;}
};

 to_string 是 C++ 标准库中的一个函数,它定义在 <string> 头文件中。这个函数用于将一个数值类型(如 intdouble 等)转换为其对应的字符串表示形式。 在给出的代码片段中,to_string(root->val) 被用来将 TreeNode 对象的 val 属性(假设是一个数值类型)转换为一个字符串。这样,就可以将该字符串与其他部分拼接起来,形成最终的树形结构字符串表示。 例如,如果 root->val 是整数 3,那么 to_string(root->val) 将返回字符串 "3"。 简而言之,to_string 函数在 C++ 中用于数值到字符串的转换。在你的代码中,它被用来将树节点的值转换为字符串,以便构建树结构的字符串表示。

这里有点难理解是左不为空,右为空。按照上面条件不是就错了吗?

我们按照题的要求前序遍历,是先根在左然后右 看递归展开图  

 

递归是一层一层展开,如果左不为空,右为空它们就会像上图那样一直找到左为空为止,

这时在递归右子树 。

 


2. 二叉树的分层遍历1。102. 二叉树的层序遍历 - 力扣(LeetCode)

解题思路 :我们创建一个队列,前序遍历这个数组,每遍历一次,就进队列一次,

根据队列的性质先进先出。就解决了!!! 

class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {queue<TreeNode* > q; //创建队列int levelSize = 0; //层数变量vector<vector<int>> vv;if(root) //节点不为空进队列{q.push(root);levelSize = 1; //为什么是1 根就只有一个。}while(!q.empty()) //如果队列不为空{vector<int> v;while(levelSize){TreeNode* front = q.front();q.pop();//出队列v.push_back(front->val); //把队顶的数据压进顺序表V//带入下一层if(front->left)q.push(front->left);if(front->right)q.push(front->right);--levelSize;}vv.push_back(v); //把每一层出完,压进二维的顺序表levelSize = q.size();//更新每一层,数据有多少个。}return vv;}
};

 


3. 二叉树的分层遍历2。107. 二叉树的层序遍历 II - 力扣(LeetCode)

这个题没什么好说的,来个投机的,把第二题逆置再返回。 

 

class Solution {
public:vector<vector<int>> levelOrderBottom(TreeNode* root) {queue<TreeNode* > q; //创建队列int levelSize = 0; //层数变量vector<vector<int>> vv;if(root) //节点不为空进队列{q.push(root);levelSize = 1; //为什么是1 根就只有一个。}while(!q.empty()) //如果队列不为空{vector<int> v;while(levelSize){TreeNode* front = q.front();q.pop();//出队列v.push_back(front->val); //把队顶的数据压进顺序表V//带入下一层if(front->left)q.push(front->left);if(front->right)q.push(front->right);--levelSize;}vv.push_back(v); //把每一层出完,压进二维的顺序表levelSize = q.size();//更新每一层,数据有多少个。}reverse(vv.begin(),vv.end()); //用迭代器逆置return vv;}};

 

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

236. 二叉树的最近公共祖先 - 力扣(LeetCode)

 

解题思路 根据解释,我们可以得出 一个在我的左子树,一个在我的右子树。我就是公共祖先。那我们可以用路径相交思路来解决,比如7和0的公共祖先。根据递归深度路径大小,

让深度更深的那个先走,等它们深度一样时,同时再走,最后相等的那个值就是公共祖先。

class Solution {
public:bool GetPath(TreeNode* root,TreeNode* x,stack<TreeNode*>& path){if(root == nullptr) //根都为空了 还找个屁{return false;}//不为空进栈path.push(root);if(root == x) // 找到了{return true;}if(GetPath(root->left,x,path)) //左递归{return true;}if(GetPath(root->right,x,path))//右递归{return true;}path.pop();//刚才条件说 一个在我的右,一个在我的左,这里左右都为空了肯定不是祖先,出栈。return false;}TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {stack<TreeNode*> pPath,qPath; //这里用栈 先进后出GetPath(root,p,pPath);GetPath(root,q,qPath);while(qPath.size() != pPath.size()){if(qPath.size()>pPath.size())qPath.pop();elsepPath.pop();}while(qPath.top() != pPath.top()){qPath.pop();pPath.pop();}return qPath.top();}
};

 


 

5. 二叉树搜索树转换成排序双向链表。二叉搜索树与双向链表_牛客题霸_牛客网 (nowcoder.com)

解题思路:中序遍历,然后 改链接方向,如何改?根的左就是prev。 右怎么改?记录父亲节点,根的右就是父亲节点  以4举例:4的左为空,那它连接就是nullptr,再看右为空返回上一层这时父亲连接它的右 

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

 

 


6. 根据一棵树的前序遍历与中序遍历构造二叉树。 105. 从前序与中序遍历序列构造二叉树 - 力扣(LeetCode)

 解题思路:前序确定什么? 确定根, 中序确定什么? 确定根的左右区间 

class Solution {
public:TreeNode* _buildTree(vector<int>& preorder, vector<int>& inorder, int& prei, int inbegin, int inend){if(inbegin > inend){return nullptr;}TreeNode* root = new TreeNode(preorder[prei]);int rooti = inbegin;//分割区间while(rooti< inend){if(inorder[rooti] == preorder[prei]){break;}elserooti++;}++prei;// 区间[inbegin, rooti-1] prei [rooti+1,inend] //转化成子问题root->left = _buildTree(preorder,inorder,prei,inbegin,rooti-1);root->right = _buildTree(preorder,inorder,prei,rooti+1,inend);return root;}TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {int i = 0;return _buildTree(preorder, inorder, i, 0, inorder.size()-1);}
};

 


7. 根据一棵树的中序遍历与后序遍历构造二叉树。106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode)

  解题思路:还是一样,中序确定根的左右区间,后序确定根。先创建右再创建左

 

​
class Solution {
public:TreeNode*  _buildTree(vector<int>& inorder, vector<int>& postorder,int& posti,int inbegin, int inend){if(inbegin > inend){return nullptr;}TreeNode* root = new TreeNode(postorder[posti]);int rooti = inbegin;while(rooti < inend){if(inorder[rooti] == postorder[posti])break;else++rooti;}++posti;root->right= _buildTree(inorder, postorder,posti ,rooti+1, inend);root->left= _buildTree(inorder, postorder,posti ,inbegin, rooti-1);return root;}TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {int i = 0;reverse(postorder.begin(),postorder.end());return _buildTree(inorder, postorder,  i, 0, inorder.size()-1); }
};​

 


8. 二叉树的前序遍历,非递归迭代实现 144. 二叉树的前序遍历 - 力扣(LeetCode)

class Solution {
public:vector<int> preorderTraversal(TreeNode* root) {//迭代用栈 stack<TreeNode*> s;vector<int> v;TreeNode* cur = root;while(cur || !s.empty()){//开始访问while(cur)v.push_back(cur->val);s.push(cur)cur = cur->left;}//访问右树TreeNode* top = s.top();s.pop();cur = top->right;}return v;
};

 

 


9. 二叉树中序遍历 ,非递归迭代实现。94. 二叉树的中序遍历 - 力扣(LeetCode)

解题思路:和前序不同的是 先访问左 再访问根 然后右。那这样的话 一直迭代到左树为空为止,然后取栈中取元素 push到vector中,最后访问右树。

 

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

 


10. 二叉树的后序遍历 ,非递归迭代实现。145. 二叉树的后序遍历 - 力扣(LeetCode)

 

解题思路:后序 先左再右然后根  右为空了再取栈顶的元素,这里不一样的是 如果左右都不空 怎么访问根? 看下图

 

从这个图可以说明 上一个访问的节点如果等于我的右子树的根,那我不就是根吗? 

 

class Solution {
public:vector<int> postorderTraversal(TreeNode* root){vector<int> v;stack<TreeNode*> s;TreeNode* cur = root;TreeNode* prev = nullptr;while(cur || !s.empty()){while(cur){s.push(cur);cur = cur->left;}TreeNode* top = s.top();if(top->right == nullptr || top->right == prev){   v.push_back(top->val);s.pop();prev = top;}elsecur = top->right;}return v;}};

 

下节预告 map和set 关注我 带你学习更多C++知识!!!! 

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

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

相关文章

MySQL经验分享:Shell开发问题

背景 之前整理过Python连接使用MySQL的经验&#xff0c;链接如下&#xff1a; pymysql封装总结_pymysql封装类-CSDN博客 相比高级语言&#xff0c;Shell与MySQL开发使用相对会更麻烦一些&#xff1b;由于 shell是linux命令集的概称&#xff0c;是属于命令行的人机界面。Shel…

1688采集商品信息 马帮 店小秘 芒果采集API接口 java php

1688详情API接口是一种基于开放平台的应用程序接口&#xff0c;它能够实现与1688平台的数据交互&#xff0c;让商家能够更加方便地获取商品详情、库存信息、价格变动等重要数据。通过这一接口&#xff0c;商家可以实时掌握市场动态&#xff0c;快速响应消费者需求&#xff0c;从…

jenkins进行自动化部署

jenkins自动化部署 hello&#xff0c;大家好&#xff0c;前文我们已经下载好我们的jenkins了&#xff0c;下面我们用jenkins来实现自动化部署啦&#xff01; 一、下载插件 我们选择插件管理 一个是Maven Integration plugin&#xff0c;一个是 Publish Over SSH 这里因为作…

【uniapp】uniapp实现免密登录

文章目录 一、概要二、整体架构流程三、技术名词解释四 、技术细节1.存取token有效期&#xff1f;2.使用setStorageSync而不使用setStorage&#xff1f;3.使用onLaunch而不使用全局路由&#xff1f; 一、概要 打开一个网页或小程序的时候&#xff0c;我们有时候会自动进入主页…

嵌入式驱动学习第五周——驱动模块

前言 Linux驱动有两种运行方式&#xff0c;第一种是将驱动编译进Linux内核中&#xff0c;另一种是编译成模块&#xff0c;本篇博客来介绍一下驱动模块。 嵌入式驱动学习专栏将详细记录博主学习驱动的详细过程&#xff0c;未来预计四个月将高强度更新本专栏&#xff0c;喜欢的可…

Oladance、南卡、韶音开放式耳机值得买吗?爆款实测拒绝踩坑!

​在寻找最佳开放式耳机的过程中&#xff0c;我亲自试用并评估了市场上三个备受欢迎的品牌&#xff1a;Oladance、南卡和韶音。通过全面的多维度性能测试&#xff0c;我旨在为大家提供准确的购买指南&#xff0c;避免因选择不当而遭遇音质失真或佩戴不适的问题。 选择正确的耳…

window7 SP2

网上很多window7 SP1的更新教程&#xff0c;很少有sp2的教程 参考博客Windows 7 Service Pack 2 Download and Install (64-bit/32-bit) 即 转到 Microsoft 网站上的 Windows 7 Service Pack 2下载页面 。 选择与 Windows 7 版本相对应的 “下载 ”链接。 也可以 登录官网…

https安全性 带给im 消息加密的启发

大家好&#xff0c;我是蓝胖子&#xff0c;在之前# MYSQL 是如何保证binlog 和redo log同时提交的&#xff1f;这篇文章里&#xff0c;我们可以从mysql的设计中学会如何让两个服务的调用逻辑达到最终一致性&#xff0c;这也是分布式事务实现方式之一。今天来看看我们能够从http…

【Qt 学习笔记】Day3 | 使用两种方式实现helloworld

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Day3 | 使用两种方式实现helloworld 文章编号&#xff1a;Qt 学习笔记…

移动硬盘怎么加密?移动硬盘加密软件有哪些?

移动硬盘是我们在工作中最常用的移动存储设备&#xff0c;为了保护数据安全&#xff0c;需要使用专业的移动硬盘加密软件加密保护。那么&#xff0c;移动硬盘加密软件有哪些&#xff1f; ​BitLocker BitLocker是Windows的磁盘加锁功能&#xff0c;可以用于加密保护移动硬盘中…

MySQL(常用函数、多表查询)

文章目录 1.数据库函数1.count函数案例答案count&#xff08;*&#xff09;与count&#xff08;列&#xff09;的区别 2.sum函数案例答案 3.avg函数案例答案 4.max/min函数案例答案 5.group by 分组统计案例答案 6.字符串相关函数演示练习 7.数学相关函数演示 8.日期相关函数演…

Linux系统使用Docker部署个人IT工具箱IT-Tools结合内网穿透实现公网访问

作为程序员&#xff0c;在日常工作中&#xff0c;需要借助一些工具来提高我们工作效率&#xff0c;IT-Tools是为开发人员度身打造的一套便捷在线工具。它提供全面功能&#xff0c;使开发者能以更高效方式完成任务。经由IT-Tools&#xff0c;开发人员能轻松应对各类技术挑战&…

鸿蒙OS开发实例:【通知消息】

背景 HarmonyOS 论坛中有研发人员求助&#xff0c;反馈通知没有没有声音&#xff0c;因此在真机上验证了一下&#xff0c;果不其然&#xff0c;没有通知的提示音&#xff0c;后来解决办法也非常简单&#xff0c;在手机设置应用中&#xff0c;将可以打开的通知提示统统改为铃声…

告别繁琐代码,只需简单拖拽,便可从0到1开发!

告别繁琐代码&#xff0c;拥抱科技未来&#xff01;只需简单拖拽&#xff0c;便可从0到1开发&#xff01;代码即刻生成&#xff0c;一键下载&#xff0c;轻松上手。我们的低代码平台&#xff0c;不仅高效便捷&#xff0c;更完全开源&#xff0c;让你自由探索编程的无限可能&…

设计模式-装饰者模式在Java中使用实例-打印发票装饰抬头和脚注

场景 设计模式-装饰者模式在Java中的使用示例&#xff1a; 设计模式-装饰者模式在Java中的使用示例_java装饰者模式例子-CSDN博客 上面装饰器的调用示例如下 AbstarctComputer computer;//要买1台电脑computer new BaseComputer();//加一个内存条computer new MemoryDecor…

【面试专题】Spring高频面试题

1.Spring应该很熟悉吧&#xff1f;来介绍下你的Spring的理解 有些同学可能会抢答&#xff0c;不熟悉!!! 好了&#xff0c;不开玩笑&#xff0c;面对这个问题我们应该怎么来回答呢&#xff1f;我们给大家梳理这个几个维度来回答 1.1 Spring的发展历程 先介绍Spring是怎么来的…

密码学 总结

群 环 域 群 group G是一个集合&#xff0c;在此集合上定义代数运算*&#xff0c;若满足下列公理&#xff0c;则称G为群。 1.封闭性 a ∈ G , b ∈ G a\in G,b\in G a∈G,b∈G> a ∗ b ∈ G a*b\in G a∗b∈G 2.G中有恒等元素e&#xff0c;使得任何元素与e运算均为元素本…

鸿蒙(HarmonyOS)ArkTs语言基础教程开发准备

本文档适用于HarmonyOS应用开发的初学者。通过构建一个简单的具有页面跳转/返回功能的应用&#xff08;如下图所示&#xff09;&#xff0c;快速了解工程目录的主要文件&#xff0c;熟悉HarmonyOS应用开发流程。 在开始之前&#xff0c;您需要了解有关HarmonyOS应用的一些基本概…

誉天华为认证存储HCIE课程怎么样

HCIA-Storage 课程介绍课程适合转行想进入IT行业者、零基础学员、IT从业人员、存储爱好者等 实验环境全真机&#xff0c;练习时间自由&#xff0c;7*24开机&#xff0c;可以随时通过远程连接进行试验课程内容 存储发展历史 存储硬件介绍 硬盘接口介绍 RAID技术 RAID2.…

解码视频流在opengl中的贴图投影计算

解码视频流在opengl中的贴图投影计算 修改顶点着色器cpp 文件放大缩小 我们把视频当成纹理,首先要确定贴入的坐标&#xff0c;原始坐标如下所示 static float vertices[] {// ---- 位置 ---- ---- 颜色 ---- - 纹理坐标 -1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f…