二叉树的层序遍历和前中后序遍历代码 迭代/递归

前中后序遍历(DFS)

首先我们要明确前中后序遍历的顺序:

  • 前序:中左右
  • 中序:左中右
  • 后序:左右中

前中后序遍历的递归代码和迭代代码分别有各自的框架,然后根据遍历顺序调整记录元素的位置即可。

递归

class Solution {
private:void postOrder(TreeNode* root, vector<int>& vec) {if (!root) return;postOrder(root->left, vec);	// 1postOrder(root->right, vec);// 2vec.push_back(root->val);		// 3}
public:vector<int> postorderTraversal(TreeNode* root) {vector<int> res;postOrder(root, res);return res;}
};
  • 前序遍历:3->1->2
  • 中序遍历:1->3->2
  • 后序遍历:1->2->3

如前所述,三种遍历的迭代方式很简单,并且更改迭代方式只要调整记录元素的位置即可。

迭代

前序遍历

我们以前序遍历给出迭代版本的框架,核心思想就是用栈。

class Solution {
public:vector<int> preorderTraversal(TreeNode* root) {vector<int> res;stack<TreeNode*> S;TreeNode* node = root;while (node || !S.empty()) {while (node) {res.push_back(node->val);			// 注意S.push(node);node = node->left;}node = S.top();		S.pop();node = node->right;	}return res;}
};

中序遍历

与前序遍历的差别请看代码中的 注意,调整了记录元素的位置。

class Solution {
public:vector<int> inorderTraversal(TreeNode* root) {if (!root) return {};vector<int> res;stack<TreeNode*> S;TreeNode* curr = root;while (curr || !S.empty()) {while (curr) {S.push(curr);curr = curr->left;}TreeNode* node = S.top();S.pop();res.push_back(node->val);			// 注意curr = node->right;}return res;}
};

后序遍历

注意到前序遍历的顺序为:中左右,而我们想要的后序遍历的顺序为:左右中。我们可以先讲前序遍历代码中访问左右子树的顺序互换,得到顺序为:中右左,再进行 reverse,得到后序:左右中。

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

层序遍历(BFS)

不需按深度划分

直接输出层序遍历序列,不需按深度划分,不同于 DFS 使用栈,这里是用队。

class Solution {
public:vector<int> levelOrder(TreeNode* root) {if (!root) return {};queue<TreeNode*> Q;// vector<vector<int>> res;vector<int> res;Q.push(root);while (!Q.empty()) {TreeNode* curr = Q.front();res.push_back(curr->val);Q.pop();if(curr->left) Q.push(curr->left);if(curr->right) Q.push(curr->right);}return res;}
}

需要按深度划分

注意在不需要按深度划分的版本的基础上做些改变,用 n 记录当前深度的节点的个数,然后在 for 循环中将这 n 个节点保存到一个数组中,下一层深度再用一个新数组保存,从而达到按深度划分。

注意在本题的基础上修改,可解决 LeetCode 中许多层序遍历的变种问题。

class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {if (!root) return {};vector<vector<int>> res;queue<TreeNode*> Q;Q.push(root);while (!Q.empty()) {vector<int> vec;int n = Q.size();for (int i=0; i<n; ++i) {TreeNode* curr = Q.front();Q.pop();vec.push_back(curr->val);if (curr->left) Q.push(curr->left);if (curr->right) Q.push(curr->right);}res.push_back(vec);}return res;}
}

Ref:

https://github.com/youngyangyang04/leetcode-master/blob/master/problems/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E8%BF%AD%E4%BB%A3%E9%81%8D%E5%8E%86.md

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

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

相关文章

java安全(五)java反序列化

给个关注&#xff1f;宝儿&#xff01; 给个关注&#xff1f;宝儿&#xff01; 给个关注&#xff1f;宝儿&#xff01; 1. 序列化 在调用RMI时,发现接收发送数据都是反序列化数据. 例如JSON和XML等语言,在网络上传递信息,都会用到一些格式化数据,大多数处理方法中&#xff0c…

git merge和rebase的区别与选择

git merge和rebase的区别与选择 转自&#xff1a;https://github.com/geeeeeeeeek/git-recipes/wiki/5.1-%E4%BB%A3%E7%A0%81%E5%90%88%E5%B9%B6%EF%BC%9AMerge%E3%80%81Rebase-%E7%9A%84%E9%80%89%E6%8B%A9#merge BY 童仲毅&#xff08;geeeeeeeeekgithub&#xff09; 这是一篇…

java安全(六)java反序列化2,ysoserial调试

给个关注&#xff1f;宝儿&#xff01; 给个关注&#xff1f;宝儿&#xff01; 给个关注&#xff1f;宝儿&#xff01; ysoserial 下载地址&#xff1a;https://github.com/angelwhu/ysoserial ysoserial可以让⽤户根据⾃⼰选择的利⽤链&#xff0c;⽣成反序列化利⽤数据&…

C++面试常见问题一

C面试常见问题一 转自&#xff1a;https://oldpan.me/archives/c-interview-answer-1 原作者&#xff1a;[oldpan][https://oldpan.me/] 前言 这里收集市面上所有的关于算法和开发岗最容易遇到的关于C方面的问题&#xff0c;问题信息来自互联网以及牛客网的C面试题目汇总。答题…

java安全(七) 反序列化3 CC利用链 TransformedMap版

给个关注&#xff1f;宝儿&#xff01; 给个关注&#xff1f;宝儿&#xff01; 给个关注&#xff1f;宝儿&#xff01; 目录图解代码demo涉及的接口与类&#xff1a;TransformedMapTransformerConstantTransformerInvokerTransformerChainedTransformerdome理解总结&#xff1a…

C++编译时多态和运行时多态

C编译时多态和运行时多态 作者&#xff1a;melonstreet 出处&#xff1a;https://www.cnblogs.com/QG-whz/p/5132745.html 本文版权归作者和博客园共有&#xff0c;欢迎转载&#xff0c;但未经作者同意必须保留此段声明&#xff0c;且在文章页面明显位置给出原文连接&#xff0…

java安全(八)TransformedMap构造POC

给个关注&#xff1f;宝儿&#xff01; 给个关注&#xff1f;宝儿&#xff01; 给个关注&#xff1f;宝儿&#xff01; 上一篇构造了一个了commons-collections的demo 【传送门】 package test.org.vulhub.Ser;import org.apache.commons.collections.Transformer; import org…

Pytorch Tutorial 使用torch.autograd进行自动微分

Pytorch Tutorial 使用torch.autograd进行自动微分 本文翻译自 PyTorch 官网教程。 原文&#xff1a;https://pytorch.org/tutorials/beginner/basics/autogradqs_tutorial.html#optional-reading-tensor-gradients-and-jacobian-products 在训练神经网络时&#xff0c;最常使用…

TVM:编译深度学习模型快速上手教程

TVM&#xff1a;编译深度学习模型快速上手教程 本文将展示如何使用 Relay python 前端构建一个神经网络&#xff0c;并使用 TVM 为 Nvidia GPU 生成一个运行时库。 注意我们需要再构建 TVM 时启用了 cuda 和 llvm。 TVM支持的硬件后端总览 在本教程中&#xff0c;我们使用 cu…

TVM:设计与架构

TVM&#xff1a;设计与架构 本文档适用于想要了解 TVM 架构和/或积极开发项目的开发人员。页面组织如下&#xff1a; 示例编译流程概述了 TVM 将模型的高层描述转换为可部署模块所采取的步骤。要开始使用&#xff0c;请先阅读本节。 逻辑架构组件部分描述了逻辑组件。后面的部…

递归+回溯

递归-回溯 本文参考自代码随想录视频&#xff1a; https://www.bilibili.com/video/BV1cy4y167mM https://www.bilibili.com/video/BV1ti4y1L7cv 递归回溯理论基础 只要有递归&#xff0c;就会有回溯&#xff0c;递归函数的下面的部分通常就是回溯的逻辑。 回溯是纯暴力的搜索…

Nvidia CUDA初级教程1 CPU体系架构综述

Nvidia CUDA初级教程1 CPU体系架构综述 视频&#xff1a;https://www.bilibili.com/video/BV1kx411m7Fk?p2 讲师&#xff1a;周斌 本节内容&#xff1a;了解现代CPU的架构和性能优化&#xff1a; 流水线 Pipelining分支预测 Branch Prediction超标量 Superscalar乱序执行 Out…

Nvidia CUDA初级教程2 并行程序设计概述

Nvidia CUDA初级教程2 并行程序设计概述 视频&#xff1a;https://www.bilibili.com/video/BV1kx411m7Fk?p3 讲师&#xff1a;周斌 本节内容&#xff1a; 为什么需要&#xff1f;怎么做&#xff1f;一些技术和概念 串并行计算模式 串行计算模式 常规软件时串行的 设计运行…

Nvidia CUDA初级教程4 GPU体系架构概述

Nvidia CUDA初级教程4 GPU体系架构概述 视频&#xff1a;https://www.bilibili.com/video/BV1kx411m7Fk?p5 讲师&#xff1a;周斌 本节内容&#xff1a; 为什么需要GPU三种方法提升GPU的处理速度实际GPU的设计举例&#xff1a; NVDIA GTX 480: FermiNVDIA GTX 680: Kepler GP…

Nvidia CUDA初级教程5 CUDA/GPU编程模型

Nvidia CUDA初级教程5 CUDA/GPU编程模型 视频&#xff1a;https://www.bilibili.com/video/BV1kx411m7Fk?p6 讲师&#xff1a;周斌 本节内容&#xff1a; CPU和GPU互动模式GPU线程组织模型&#xff08;需要不停强化&#xff09;GPU存储模型基本的编程问题 CPU与GPU交互 各自…

Nvidia CUDA初级教程6 CUDA编程一

Nvidia CUDA初级教程6 CUDA编程一 视频&#xff1a;https://www.bilibili.com/video/BV1kx411m7Fk?p7 讲师&#xff1a;周斌 GPU架构概览 GPU特别使用于&#xff1a; 密集计算&#xff0c;高度可并行计算图形学 晶体管主要被用于&#xff1a; 执行计算而不是 缓存数据控制指令…

由前中后遍历序列构建二叉树

由前/中/后遍历序列构建二叉树 基础 首先&#xff0c;我们需要知道前中后序三种深度优先遍历二叉树的方式的具体顺序&#xff1a; 前序&#xff1a;中左右中序&#xff1a;左中右后序&#xff1a;左右中 另外&#xff0c;要知道只有中序前/后序可以唯一确定一棵二叉树&…

手写nms

手写nms 计算宽高的时候加1是为什么&#xff1f; 本文总结自互联网的多种nms实现&#xff0c;供参考&#xff0c;非博主原创&#xff0c;各原文链接如下&#xff0c;也建议大家动手写一写。 Ref&#xff1a; 浅谈NMS的多种实现 目标窗口检测算法-NMS非极大值抑制 一、fas…

目标检测综述

目标检测综述 转自&#xff1a;https://zhuanlan.zhihu.com/p/383616728 论文参考&#xff1a;[Object Detection in 20 Years: A Survey][https://arxiv.org/abs/1905.05055] 引言 目标检测领域发展至今已有二十余载&#xff0c;从早期的传统方法到如今的深度学习方法&#x…

Nvidia CUDA初级教程7 CUDA编程二

Nvidia CUDA初级教程7 CUDA编程二 视频&#xff1a;https://www.bilibili.com/video/BV1kx411m7Fk?p8 讲师&#xff1a;周斌 本节内容&#xff1a; 内置类型和函数 Built-ins and functions线程同步 Synchronizing线程调度 Scheduling threads存储模型 Memory model重访 Matr…