二叉树的 Morris 中序遍历

news/2024/11/17 3:45:35/文章来源:https://www.cnblogs.com/sparkyen/p/18415231

回顾

问题陈述: 给定一棵二叉树,实现中序遍历并返回包含其中序序列的数组

例如给定下列二叉树:
image

我们按照左、根、右的顺序递归遍历二叉树,得到以下遍历:
image

最终中序遍历结果可以输出为: [3, 1, 9, 2, 4, 7, 5, 8, 6]

Morris trick

Morris 中序遍历是一种树遍历算法,旨在实现 O(1) 的空间复杂度,无需递归或外部数据结构。该算法应高效地按中序顺序访问二叉树中的每个节点,并在遍历过程中打印或处理节点值,而无需使用堆栈或递归。

点击查看代码
                            
#include <iostream>
#include <sstream>
#include <unordered_map>
#include <vector>
#include <queue>
#include <map>using namespace std;// TreeNode structure
struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};class Solution {
public:// Function to perform iterative Morris// inorder traversal of a binary treevector<int> getInorder(TreeNode* root) {// Vector to store the// inorder traversal resultvector<int> inorder;// Pointer to the current node,// starting from the rootTreeNode* cur = root;// Loop until the current// node is not NULLwhile (cur != NULL) {// If the current node's// left child is NULLif (cur->left == NULL) {// Add the value of the current// node to the inorder vectorinorder.push_back(cur->val);// Move to the right childcur = cur->right;} else {// If the left child is not NULL,// find the predecessor (rightmost node// in the left subtree)TreeNode* prev = cur->left;while (prev->right && prev->right != cur) {prev = prev->right;}// If the predecessor's right child// is NULL, establish a temporary link// and move to the left childif (prev->right == NULL) {prev->right = cur;cur = cur->left;} else {// If the predecessor's right child// is already linked, remove the link,// add current node to inorder vector,// and move to the right childprev->right = NULL;inorder.push_back(cur->val);cur = cur->right;}}}// Return the inorder// traversal resultreturn inorder;}
};int main() {TreeNode* root = new TreeNode(1);root->left = new TreeNode(2);root->right = new TreeNode(3);root->left->left = new TreeNode(4);root->left->right = new TreeNode(5);root->left->right->right = new TreeNode(6);Solution sol;vector<int> inorder = sol.getInorder(root);cout << "Binary Tree Morris Inorder Traversal: ";for(int i = 0; i< inorder.size(); i++){cout << inorder[i] << " ";}cout << endl;return 0;
}

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

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

相关文章

帝国cms生成文章图片怎么弄的

在帝国CMS中生成文章图片通常指的是为文章添加封面图或者特色图片。这里有两种情况:一种是手动添加图片,另一种是使用插件自动生成图片。 手动添加图片上传图片:首先,你需要将图片上传到帝国CMS的服务器上。可以通过后台的“文件管理”功能上传图片。插入图片到文章:在撰写…

docker安装prometheus+Granfan并监控容器

docker安装普罗米修斯+Granfan并监控容器 一、基本概念 ​ 1、之间的关系 ​ prometheus与grafana之间是相辅相成的关系。作为完美的分布式监控系统的Prometheus,就想布加迪威龙一样示例和动力强劲。在猛的车也少不了仪表盘来观察。于是优雅的可视化平台Grafana…

「KDOI-06-S」题解

T2 树上异或 题面 分析 树形 DP 题 考虑一颗子树内部的某种割边方式,假设其被分为 \(n\) 个连通块,每个连通块的权值分别为 \(a_1, a_2, \dots, a_n\),那么该子树在这种割边方式下对答案的贡献就为 \(\prod_{i = 1}^{n} a_i\)。 因此就可以从叶子向根不断合并,求出每种割边…

安卓签名校验机制

安卓签名校验机制 目录1 V1方案1.1 V1方案的安全性2 V2方案2.1 摘要计算过程 2.2 防回滚绕过3 V3方案 4 V4方案 5 签名实践5.1 keytool生成密钥库 5.2 jarsigner 5.3 apksigner6 引用安卓的签名校验机制共有三代。 9.0以上的系统会判断apk是否使用到V3版本的签名,如果有,那么…

胡鑫宇第一次作业

软件技术第一次作业作业属于哪个课程 https://edu.cnblogs.com/campus/zjlg/rjjc/作业的要求 发布一篇随笔,对自己进行简单介绍姓名 胡鑫宇学号 2022329301143班级 22电气工程及其自动化(2)一、个人介绍 1. 个人情况 大家好,我是电气工程及其自动化2班的胡鑫宇,来自河北邯…

安卓应用启动流程

安卓应用启动流程 目录1 冷启动热启动 2 zygote和SystemServer 3 应用启动流程简述(记得补充) 4 从点击图标到通知Zygote4.1 Launcher 4.2 Activity.java 4.3 Instrumentation.java 4.4 ActivityTaskManager.java 4.5 ActivityTaskManagerService.java 4.6 ActivityStarter.j…

痞子衡嵌入式:JLink命令行以及JFlash对于下载算法的作用地址范围认定QN

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是JLink命令行以及JFlash对于下载算法的作用地址范围认定。最近痞子衡在给一个 RT1170 客户定制一个 Infineon MirrorBit 类型 64MB Flash 的 SEGGER 下载算法,做完之后在 JFlash 下测试小数据下载没有问题,但…

安卓系统启动流程解析

安卓系统启动流程 目录1 init阶段1.1 FirstStage 1.2 SELinux Setup 1.3 SecondStage2 init.rc的配置 3 Zygote的启动3.1 app_process 3.2 Zygoteinit.java4 SystemServer 5 总结 6 引用光看分析文章还是不够的,还是要和实践结合。 1 init阶段 init 命令的入口是init/main.cpp…

安卓架构

安卓架构 目录1 Linux 内核层 2 硬件抽象层 HAL 3 Native C/C++ 库 && Android Runtime 4 Java Framework 层 5 System Apps 层1 Linux 内核层 Android 平台的基础是 Linux 内核。例如,ART 依靠 Linux 内核来执行底层功能。Linux 内核的安全机制为 Android 提供了相应…

陈柯烽的第一次作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/zjlg/rjjc这个作业的目标 建立一个属于自己的博客,介绍自己以及表达对课程的期望姓名-学号 陈柯烽-2022329301006软件技术基础第一次作业 一、自我介绍 1、基本信息我叫陈柯烽,来自浙江宁波,是自动化22级一班的学生,我…

chm 文件打开只显示目录,不显示内容

chm 文件打开只显示目录,不显示内容解决方法:解除锁定OK 了

【好用安全保密】不用插件,压缩js、html、css、code【一眼就会系列】【亲测有效】

​ 仅用离线版Notepad搞定。不用插件及辅助工具,有效保证了文件信息安全。 (一般发布版本都是无注释的-压缩文件和已编译文件。为了信息安全性,所有都是离线-区域网研发。) ​ 总结: 先把文本中注释去掉。 notepad++ 【编辑】-【空白字符操作】-【移除行首和行尾空格】 …