代码随想录刷题随记12-二叉树遍历

代码随想录刷题随记12-二叉树遍历

文章目录

  • 代码随想录刷题随记12-二叉树遍历
    • 二叉树的递归遍历
    • 二叉树的迭代遍历
      • 前序遍历
      • 中序遍历
      • 后序遍历
    • 二叉树的统一迭代法

二叉树的递归遍历

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:void pre(TreeNode* root,vector<int>& ret){if(root==nullptr)return;ret.push_back(root->val);pre(root->left,ret);pre(root->right,ret);}vector<int> preorderTraversal(TreeNode* root) {vector<int>  ret;pre(root,ret);return ret;}
};

中序后序,只要改变一下上述代码的相对位置即可

二叉树的迭代遍历

可以使用栈实现前序中序和后序遍历

前序遍历

前序遍历是中左右,每次先处理的是中间节点,那么先将根节点放入栈中,然后将右孩子加入栈,再加入左孩子。

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

中序遍历

但是中序遍历用上面的逻辑就改不出来了
为什么刚刚写的前序遍历的代码,不能和中序遍历通用:
因为前序遍历的顺序是中左右,先访问的元素是中间节点,要处理的元素也是中间节点,所以刚刚才能写出相对简洁的代码,因为要访问的元素和要处理的元素顺序是一致的,都是中间节点
中序遍历是左中右,先访问的是二叉树顶部的节点,然后向下访问,直到到达树左面的最底部,再开始处理节点,处理顺序和访问顺序是不一致的

那么在使用迭代法写中序遍历,就需要借用指针的遍历来帮助访问节点,栈则用来处理节点上的元素。
中序遍历leetcode
解题代码:

class Solution {
public:vector<int> inorderTraversal(TreeNode* root) {vector<int>  ret;TreeNode * cur=root;stack<TreeNode *> mystack;while(!mystack.empty()||cur!=nullptr){//遍历节点if(cur!=nullptr){mystack.push(cur);cur=cur->left;}//访问节点else{cur=mystack.top();mystack.pop();ret.push_back(cur->val);cur=cur->right;}}return ret;}
};

后序遍历

先序遍历是中左右,后续遍历是左右中,那么我们只需要调整一下先序遍历的代码顺序,就变成中右左的遍历顺序,然后在反转result数组,输出的结果顺序就是左右中了
后序遍历leetcode
源码:

class Solution {
public:vector<int> postorderTraversal(TreeNode* root) {vector<int>  ret;stack<TreeNode *> mystack;if(root==nullptr)return {};mystack.push(root);while(!mystack.empty()){TreeNode * cur=mystack.top();mystack.pop();ret.push_back(cur->val);if(cur->left!=nullptr){mystack.push(cur->left);}if(cur->right!=nullptr){mystack.push(cur->right);}}reverse(ret.begin(), ret.end());return ret;}
};

二叉树的统一迭代法

上面的迭代方法,每种的思路都不一样很不方便。探索一种统一的迭代模式
要处理的节点放入栈之后,紧接着放入一个空指针作为标记。 这种方法也可以叫做标记法。
中序遍历

class Solution {
public:vector<int> inorderTraversal(TreeNode* root) {vector<int> ret;stack<TreeNode* > mystack;if(root==nullptr)return {};mystack.push(root);TreeNode * cur;while(!mystack.empty()){cur=mystack.top();if(cur!=nullptr){mystack.pop();if(cur->right!=nullptr){mystack.push(cur->right);}               mystack.push(cur);mystack.push(NULL);if(cur->left!=nullptr){mystack.push(cur->left);}}else{mystack.pop();cur=mystack.top();mystack.pop();ret.push_back(cur->val);                }}return ret;}
};

前序和后序只需要调整位置即可

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

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

相关文章

《QT实用小工具·七》CPU内存显示控件

1、概述 源码放在文章末尾 CPU内存显示控件 项目包含的功能如下&#xff1a; 实时显示当前CPU占用率。实时显示内存使用情况。包括共多少内存、已使用多少内存。全平台通用&#xff0c;包括windows、linux、ARM。发出信号通知占用率和内存使用情况等&#xff0c;以便自行显示…

类和对象的下篇

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary_walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

2024年03月CCF-GESP编程能力等级认证Scratch图形化编程二级真题解析

本文收录于专栏《Scratch等级认证CCF-GESP真题解析》,专栏总目录・点这里. 一、单选题(共 10 题,每题 3 分,共 30 分) 第1题 小杨的父母最近刚刚给他买了一块华为手表,他说手表上跑的是鸿蒙,这个鸿蒙是?( )。 A、小程序 B、计时器 C、操作系统 D、神话人物 答案:…

【漏洞复现】大华 DSS user_edit.action 信息泄露漏洞

0x01 产品简介 DSS是大华的大型监控管理应用平台&#xff0c;支持几乎所有涉及监控等方面的操作&#xff0c;支持多级跨平台联网等操作。 可将视频监控、卡口拍照、 区间测速 、电子地图、违章查询系统等诸多主流应用整合在一起&#xff0c;实现更加智能、便捷的分级查询服务。…

CPU设计实战-FPGA基础操作学习

目录 硬件调试方法 ILA&#xff08;监控内如何端口信号&#xff09;或VIO核&#xff08;不仅可以监控还可以驱动&#xff09;进行硬件调试 添加ILAIP核 实例化ILAIP核 使用ILA排查错误 另一个debug方法 仿真 代码固化&#xff08;即写入Flash中&#xff09; 方法一 方…

代码随想录算法训练营第四十二天 | 卡码网46. 携带研究材料、416. 分割等和子集

代码随想录算法训练营第四十二天 | 卡码网46. 携带研究材料、416. 分割等和子集 卡码网46. 携带研究材料题目解法 416. 分割等和子集题目解法 感悟 卡码网46. 携带研究材料 题目 解法 题解链接 二维数组 # include <bits/stdc.h> using namespace std;int n, bagweig…

Jackson 2.x 系列【6】注解大全篇二

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Jackson 版本 2.17.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-jaskson-demo 文章目录 注解大全2.11 JsonValue2.12 JsonKey2.13 JsonAnySetter2.14 JsonAnyGetter2.15 …

WebKit揭秘:从内部结构到应用程序开发

文章目录 WebKit结构简介核心模块其他组件多进程架构&#xff08;WebKit2&#xff09; Wekbit做了什么&#xff1f;应用程序如何利用 Webkit WebKit结构简介 WebKit是一个开源的浏览器引擎&#xff0c;它由多个模块组成&#xff0c;这些模块协同工作以提供Web内容的渲染和交互…

189.轮转 数组

题目描述 解题思路 —————冒泡排序的超时算法—————— 1.k1 就是第一个元素不断向后一个元素调换位子&#xff0c;直到轮转到最后一个位置&#xff08;类似于冒泡排序&#xff0c;不断向后冒出&#xff09; 2.调用循环&#xff0c;当k>0的时候&#xff0c;不断向…

web有哪些方式可以实时更新数据

在Web开发中&#xff0c;有几种方式可以实现数据的实时更新&#xff0c;以确保用户界面能够及时反映后端数据的变化。 以下是一些常用的实现实时数据更新的技术&#xff1a; 一. AJAX轮询&#xff08;Polling&#xff09; 轮询是一种通过定时发送HTTP请求到服务器来检查数据…

【2024最新】vue3的基本使用(超详细)

一、Vue 3 概述 1. 为什么要学习Vue 3 Vue 3是Vue.js的最新主要版本&#xff0c;它带来了许多改进和新特性&#xff0c;包括但不限于&#xff1a; 性能提升&#xff1a;Vue 3提供了更快的渲染速度和更低的内存使用率。Composition API&#xff1a;引入了一个新的API&#xf…

英伟达智算先锋训练,冲刺智算时代实战

随着数字经济的深入发展&#xff0c;智能算力作为关键生产力&#xff0c;其规模在2022年已达到268.0 EFLOPS&#xff0c;并预计到2028年将增长至2769 EFLOPS&#xff0c;显示出强劲的发展势头。在2024年政府工作报告中&#xff0c;也首次提出了“人工智能”行动&#xff0c;强调…

baseDao增删改查.

这里写目录标题 1、baseDao增删改查介绍2、basDao类3、BasDao类的作用 1、baseDao增删改查介绍 (1)、增加Create&#xff09;操作&#xff1a; 通过BaseDao的insert方法可以向数据库中插入一条新的记录。 该方法接受一个实体对象作参数&#xff0c;将该对象的属性映射到表的字…

Python轻量级框架Flask开发web应用(附源码自取)

目录 介绍 安装 简单初使用 新建项目目录 视图映射 无参映射 带参映射 ? 传参映射 连接mysql orm对象视图映射建表 ​编辑 crud操作 新增操作 查询操作 普通查询 查询返回json数据 前端传递json体数据查询 更新操作 删除操作 orm表关系映射 flask-migrate迁…

【Vue】vue3简介与环境配置

文章目录 项目编码规范什么是 Vue&#xff1f;安装node环境nvm针对node版本惊醒管理的工具 项目编码规范 组合式API Typescript setup(语法糖) 什么是 Vue&#xff1f; Vue 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;…

JavaBean是什么?

Bean的本意为豌豆、子实&#xff0c;在这里引申为一种实体。JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean&#xff0c;类必须是具体的和公共的&#xff0c;并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性&#xff0…

951. 翻转等价二叉树

跳转题目 判断两棵树是否为反转关系。 /*** 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)…

操作系统高频面试知识总结 part1

操作系统 1.什么是操作系统&#xff1f;2.并发与并行&#xff1f;3.同步与异步&#xff1f;4.阻塞和非阻塞&#xff1f;5.什么是进程&#xff1f;6.什么是线程&#xff1f;7.进程与线程的区别&#xff1f;8.进程地址空间&#xff1f;9.进程常见状态&#xff1f;10.进程间通信&a…

Google人才选拔的独特视角

Google人才选拔的独特视角 独特的人才选拔标准 Google作为全球最大的搜索引擎公司&#xff0c;拥有无数优秀的人才。他们的选拔标准与众不同&#xff0c;有着自己独特的人才观。 重视多元化的背景 Google相信人才的多元化背景能够给公司带来不同的思考角度和创新思维。他们…

【总结】在嵌入式设备上可以离线运行的LLM--Llama

文章目录 Llama 简介运用另一种&#xff1a;MLC-LLM 一个令人沮丧的结论在资源受限的嵌入式设备上无法运行LLM&#xff08;大语言模型&#xff09;。 一丝曙光&#xff1a;tinyLlama-1.1b&#xff08;10亿参数&#xff0c;需要至少2.98GB的RAM&#xff09; Llama 简介 LLaMA…