代码随想录训练营第十三天

第一题:

原题链接:144. 二叉树的前序遍历 - 力扣(LeetCode)

思路1:递归法

当传递下去的节点为空的时候,返回。

前序遍历的话顺序是根左右,因此一来变先将节点的值添加进res数组中,然后先向左递归再向右递归,结果都存在res数组中。

代码如下:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:vector<int> preorderTraversal(TreeNode* root) {vector<int> res;qianxu(root, res);return res;}
private:void qianxu(TreeNode* root, vector<int>& res){if(root == nullptr) return;res.push_back(root -> val);if(root -> left != nullptr) qianxu(root -> left, res);if(root -> right != nullptr) qianxu(root -> right, res);}
};

思路2:

迭代法:

就是先定义一个栈,把二叉树的每一层的元素都放入栈中,然后对栈进行操作,把栈中的元素取出放入到结果数组中。注意要先将右节点放入栈中再将左节点放入栈中,因为出栈的时候是栈顶元素先出栈。

代码如下:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:vector<int> preorderTraversal(TreeNode* root) {stack<TreeNode*> st;vector<int> res;if(root == nullptr) return {};st.push(root);while(!st.empty()){TreeNode* node = st.top();st.pop();res.push_back(node -> val);if(node -> right != nullptr) st.push(node -> right);if(node -> left != nullptr) st.push(node -> left);}return res;}};

中序遍历:

原题链接:94. 二叉树的中序遍历 - 力扣(LeetCode)

递归法:左根右。

代码如下:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:vector<int> inorderTraversal(TreeNode* root) {vector<int> res;zhongxu(root, res);return res;}
private:void zhongxu(TreeNode* root, vector<int>& res){if(root == nullptr) return;if(root -> left != nullptr) zhongxu(root -> left, res);res.push_back(root -> val);if(root -> right != nullptr) zhongxu(root -> right, res);}
};

迭代法 :

因为在中序遍历中,遍历顺序是左中右,而且先访问的是二叉树的顶部的节点,然后一层一层向下访问,直到到达树左面的最底部,再开始处理节点,这样就造成了处理顺序和访问顺序的不一致。因此要用一根指针的遍历来访问节点,栈则用来处理节点上的元素。

代码如下:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:vector<int> inorderTraversal(TreeNode* root) {stack<TreeNode*> st;if(root == nullptr) return {};vector<int> res;TreeNode* cur = root;while(cur != nullptr || !st.empty()){if(cur != nullptr){st.push(cur);cur = cur -> left;           // 左}else{cur = st.top();st.pop();res.push_back(cur -> val);  // 中cur = cur -> right;          // 右}}return res;}
};

后序遍历:

递归法:

代码如下:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:vector<int> postorderTraversal(TreeNode* root) {vector<int> res;houxu(root, res);return res;}
private:void houxu(TreeNode* root, vector<int>& res){if(root == nullptr) return;if(root -> left != nullptr) houxu(root -> left, res);if(root -> right != nullptr) houxu(root -> right, res);res.push_back(root -> val);}
};

迭代法:

代码如下:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:vector<int> postorderTraversal(TreeNode* root) {vector<int> res;stack<TreeNode*> st;if(root == nullptr) return {};st.push(root);while(!st.empty()){TreeNode* node = st.top();st.pop();res.push_back(node -> val);if(node -> left) st.push(node -> left);if(node -> right) st.push(node -> right);}reverse(res.begin(), res.end());return res;}
};

第二题:

原题链接:102. 二叉树的层序遍历 - 力扣(LeetCode)

思路:

用一个队列来保存每一层的元素,然后从队列前端弹出放入结果数组中即可。

注意的细节点:

在将每一层的元素放入数组中的时候,一定要将size提前声明并赋值好,不然在操作的时候que.size()是会变化的。

代码如下:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> res;if(root == nullptr) return {};queue<TreeNode*> que;que.push(root);while(!que.empty()){int size = que.size();vector<int> path;for(int i = 0; i < size; i++){TreeNode* node = que.front();path.push_back(node -> val);que.pop();if(node -> left) que.push(node -> left);if(node -> right) que.push(node -> right);}res.push_back(path);}return res;}
};

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

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

相关文章

如何给mysql创建组合索引并分析索引命中(官方校正版)

MySQL 可以使用多列索引来执行测试索引中所有列的查询&#xff0c;或者仅测试第一列、前两列、前三列等的查询。如果您在索引定义中以正确的顺序指定列&#xff0c;则单个复合索引可以加速同一表上的几种查询。 MySQL 可以创建复合索引&#xff08;即在多个列上建立索引&#x…

HTML星空特效

目录 写在前面 完整代码 代码分析 运行效果 系列文章 写在后面 写在前面 100行代码实现HTML星空特效。 完整代码 全部代码如下。 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&g…

【Redis】基于Redission实现分布式锁(代码实现)

目录 基于Redission实现分布式锁解决商品秒杀超卖的场景&#xff1a; 1.引入依赖&#xff1a; 2.加上redis的配置&#xff1a; 3.添加配置类&#xff1a; 4.编写代码实现&#xff1a; 5.模拟服务器分布式集群的情况&#xff1a; 1.右键点击Copy Configuration 2.点击Modi…

怎么投资中证全指证券公司指数?

中证全指证券公司指数的代码是399975&#xff0c;有50只成分股&#xff0c;几乎包含了市场上所有主要的证券公司&#xff0c;算是指数基金中投资证券行业的不二选择。 根据天天基金的数据显示&#xff0c;市面上有31只跟踪该指数的基金&#xff0c;规模最大的是南方中证全指证…

【Java面试】二十二、JVM篇(下):JVM参数调优与排查

文章目录 1、JVM的参数在哪里设置2、常见的JVM调优参数有哪些3、常见的JVM调优工具有哪些4、Java内存泄漏的排查思路5、CPU飙高的排查思路 1、JVM的参数在哪里设置 war包部署&#xff0c;在tomcat中设置&#xff0c;修改TOMCAT_HOME/bin/catalina.sh 文件 jar包启动&#xff0…

jpg格式图片无法打开可以修复吗?有哪些方法?

JPG的图片打不开怎么办呢&#xff1f;当JPG图片打不开的时候&#xff0c;我们需要先了解下具体的原因&#xff0c;是因为格式不支持&#xff0c;还是因为图片文件损坏。不同的原因&#xff0c;解决的方法也会不同&#xff0c;比如图片损坏&#xff0c;我们就需要对图片修复处理…

web爬虫笔记:js逆向案例九(某多多 anti_content参数)补环境流程

web爬虫笔记:js逆向案例九(某多多 anti_content参数)补环境流程 一、目标网站:aHR0cHM6Ly9tb2JpbGUueWFuZ2tlZHVvLmNvbS8= 二、接口分析 1、快速定位加密位置(通过搜索/cells/hub/v3快速定位到加密js文件) 2、通过分析可知&#

双系统下,如何隐藏另一个系统分区?

前言 最近有小伙伴在公众号下留言&#xff1a; 小伙伴说&#xff1a;“双系统时&#xff0c;非当前系统的系统盘能不能屏蔽&#xff1f;&#xff01;比如Win7的系统盘在Win10系统时&#xff0c;盘符成了D盘&#xff0c;安装应用软件时&#xff0c;有些文件就到了D盘&#xff0…

DuDuTalk:智能电子录音工牌在销售场景的应用价值

在快速变化的市场环境中&#xff0c;销售团队面临着日益激烈的竞争和不断变化的客户需求。为了提升销售效率、优化客户体验并加强团队协作&#xff0c;越来越多的企业开始采用智能电子录音工牌作为销售场景中的关键工具。本文将从多个方面探讨智能电子录音工牌在销售场景中的应…

Java17 --- SpringSecurity之授权

目录 一、授权 1.1、基于request的授权 1.2、请求未授权处理 1.3、角色分配 1.4、基于方法授权 一、授权 1.1、基于request的授权 Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws Exception {httpSecurity.sessionManagement…

一图读懂腾讯云EdgeOne Open Edge平台

为了鼓励更多开发者参与、共同构建和改进边缘应用&#xff0c;腾讯云EdgeOne面向广大开发者&#xff0c;打造了技术开放共创平台——OpenEdge&#xff0c;该平台是国内首个全免费的边缘应用平台&#xff0c;不仅进一步开放了腾讯云遍布世界各地的边缘节点能力&#xff0c;还可以…

Ollama(docker)+ Open Webui(docker)+Comfyui

Windows 系统可以安装docker desktop 相对比较好用一点&#xff0c;其他的应该也可以 比如rancher desktop podman desktop 安装需要windows WSL 安装ollama docker docker run -d --gpusall -v D:\ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama 这里…

微服务必备容器化技术

文章目录 docker介绍与安装及上手应用什么是容器化技术&#xff1f;为什么需要学习docker&#xff1f;如何理解dockerdocker下载与安装docker的基础组成docker体验 dockerfile介绍并创建go-zero环境容器docker的基础组成从容器构建属于go环境的容器基于dockerfile构建go容器镜像…

最新技术:跨境电商源码,应对多国市场需求,让您轻松开展全球业务!

随着全球化进程的不断推进&#xff0c;跨境电商已成为企业拓展国际市场的重要途径。为了满足不同国家和地区消费者不断增长的需求&#xff0c;跨境电商源码应运而生&#xff0c;为企业提供了便捷高效的全球化业务发展方案。 一、全球化运营的关键 跨境电商源码的核心功能在于…

基本循环神经网络(RNN)

RNN背景&#xff1a;RNN与FNN 在前馈神经网络中&#xff0c;信息的传递是单向的&#xff0c;这种限制虽然使得网络变得更容易学习&#xff0c;但在一定程度上也减弱了神经网络模型的能力。 在生物神经网络中&#xff0c;神经元之间的连接关系要复杂的多。前馈神经网络可以看着…

【小学期】参考项目-Java初学者的15个练手项目推荐

Java初学者的15个练手项目推荐 很高兴看到大家已经掌握了Java的基础知识。为了帮助大家巩固和提高编程技能&#xff0c;我为你们准备了15个简单的Java项目。这些项目不仅覆盖了增删改查&#xff08;CRUD&#xff09;操作&#xff0c;还能帮助大家熟悉面向对象编程、异常处理、…

PySide(PyQt)的特殊按钮(互锁、自锁、独占模式)

界面图: Qt Designer中创建窗口,放置一个QGroupBox,命名为btnStation,这就是自定义的按钮站,按钮站里放置6个按钮。自锁按钮相当于电器中的自锁功能的按钮,每按一次状态反转并保持不变。独占按钮也是自锁功能的按钮,不同的是当独占按钮为ON时,其余所有按钮均被置为OFF…

QT与VS的区别?使用QT的好处?

Qt 和 Visual Studio (VS) 是两个不同的概念&#xff0c;它们在软件开发领域扮演着不同的角色&#xff1a; Qt&#xff1a; Qt 是一个跨平台的应用程序和用户界面框架&#xff0c;使用 C 编写&#xff0c;支持多种编程语言的绑定。它提供了一套丰富的工具和库&#xff0c;用于…

SmartEDA革新电路设计:告别繁琐,轻松步入智能时代!

在数字化浪潮席卷而来的今天&#xff0c;电路设计的复杂性和繁琐性一直是工程师们面临的难题。然而&#xff0c;随着科技的进步&#xff0c;一款名为SmartEDA的电路设计工具应运而生&#xff0c;它以智能化、高效化的特点&#xff0c;彻底颠覆了传统电路设计的方式&#xff0c;…

vue3写一个定时器

vue3没有this&#xff0c;取而代之的是proxy 所以在定时器的写法上也有所不同 话不多说直接上代码 <template> <p>剩余时间:{{ count }}</p> </template> export default{ const seconds ref(1800);//定义一下秒数&#xff0c;根据秒数来计算&…