(含morris遍历)代码随想录 Leetcode144/94/145 二叉树的前/中/后序遍历

题目:

前:

中:

后:


代码(首刷自解 2024年1月24日):

//前序遍历,递归
class Solution {
public:
    void funcOfRecursion(TreeNode* cur, vector<int>& vec) {
        if (cur == nullptr) return;
        vec.emplace_back(cur->val);
        funcOfRecursion(cur->left,vec);
        funcOfRecursion(cur->right,vec);
    }
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> vec = {};
        if (root == nullptr) return vec;
        funcOfRecursion(root,vec);
        return vec; 
    }
};
//中序遍历,递归
class Solution {
public:
    void funcOfRecursion(TreeNode* cur,vector<int>& vec) {
        if(cur == nullptr) return;
        funcOfRecursion(cur->left,vec);
        vec.emplace_back(cur->val);
        funcOfRecursion(cur->right,vec);
    }
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> vec = {};
        if(root == nullptr) return vec;
        funcOfRecursion(root,vec);
        return vec;
    }
};
//后序遍历,递归
class Solution {
public:
    void funcOfRecursion(TreeNode* cur, vector<int>& vec) {
        if(cur == nullptr) return;
        funcOfRecursion(cur->left,vec);
        funcOfRecursion(cur->right,vec);
        vec.emplace_back(cur->val);
    }
    vector<int> postorderTraversal(TreeNode* root) {
        vector<int> vec = {};
        if(root == nullptr) return vec;
        funcOfRecursion(root,vec);
        return vec;
    }
};
//前序遍历,迭代
class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> res = {};
        if(root == nullptr) return res;
        stack<TreeNode*> st;
        TreeNode* cur = root;
        st.push(cur);
        while (!st.empty()) {
            TreeNode* node = st.top();
            st.pop();
            res.emplace_back(node->val);
            if(node->right) st.push(node->right);
            if(node->left) st.push(node->left);
        }
        return res;
    }
};
//中序遍历,迭代
class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> res = {};
        if(root == nullptr) return res;
        stack<TreeNode*> st;
        TreeNode* cur = root;
        while (!st.empty() || cur != NULL) {
            if (cur != nullptr) {
                st.push(cur);
                cur = cur -> left;
            } else {
                cur = st.top();
                res.emplace_back(cur->val);
                st.pop();
                cur = cur -> right;
            }
        }
        return res;
    }
};
//后序遍历 迭代
class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        vector<int> res = {};
        if(root == nullptr) return res;
        stack<TreeNode*> st;
        TreeNode* cur = root;
        st.push(cur);
        while (!st.empty()) {
            TreeNode* node = st.top();
            st.pop();
            res.emplace_back(node->val);
            if(node->left) st.push(node->left);
            if(node->right) st.push(node->right);
        }
        reverse(res.begin(),res.end());
        return res;
    }
};

代码(二刷自解 2024年1月24日  morris遍历):

class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> res = {};
        if(root == nullptr) return res;
        TreeNode* cur = root;
        while (cur != nullptr) {
            if (cur->left) {
                TreeNode* predessor = cur->left;
                while (predessor->right && predessor->right != cur) {
                    predessor = predessor->right;
                }
                if (predessor->right == cur) {
                    predessor->right = nullptr;
                    cur = cur->right;
                } else {
                    res.emplace_back(cur->val);
                    predessor->right = cur;
                    cur = cur->left;
                }
            } else {
                res.emplace_back(cur->val);
                cur = cur->right;
            }
        }
        return res;
    }
};

        morris前序遍历,时间复杂度O(n),空间复杂度O(1);

设当前节点为cur

while (cur!=nullptr) {

        if(cur有左孩子){

                if(cur的前驱右孩子是x) 前驱右孩子设为null,cur = cur右孩子;

                if(cur的前驱右孩子为空) cur加入结果数组,前驱右孩子设为cur,cur=cur左孩子;

        }

        else if(cur没有左孩子){

                cur加入结果数组;

                cur = cur ->right;

        }

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【软考问题】-- 2 - 知识精讲 - 项目立项管理

一、基本问题 1&#xff1a;项目投资前时期的四个阶段是什么&#xff1f; a.项目建议与立项申请 (1)定义&#xff1a;项目建设单位向上级主管部门提交项目申请时所必须的文件。(2)特点&#xff1a;项目发展周期的初始阶段、可行性研究的依据。(3)注意&#xff1a;又称项目建议书…

【QT+QGIS跨平台编译】之八:【zstd+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、zstd介绍二、文件下载三、文件分析四、pro文件五、编译实践一、zstd介绍 ZSTD(Zstandard的缩写),是一种快速压缩算法,提供了高压缩比功能。ZSTD还为小数据提供了一种特殊的模式,称为字典压缩。ZSTD库使用BSD许可证作为开放源码软件提供的。它的格式是稳定的,…

C# 实现 Word 加盖骑缝章效果

目录 实现效果 范例运行环境 Office DCOM 配置 设计实现 创建stamp图章类 电子章图片的计算与定位 旋转图片方法 总结 实现效果 在OA的自动化处理系统中&#xff0c;通过审批的最终节点&#xff0c;可能会对WORD文件加盖电子章&#xff0c;比如定位带有指定文字的Ra…

【C++入门到精通】智能指针 shared_ptr循环引用 | weak_ptr 简介及C++模拟实现 [ C++入门 ]

阅读导航 引言一、std::shared_ptr的循环引用1. 概念2. 示例分析 二、std::weak_ptr1. 简介2. weak_ptr模板类提供的成员方法3. 使用示例&#xff08;1&#xff09;weak_ptr指针的创建&#xff08;2&#xff09;完整示例&#xff08;解决上面循环引用问题&#xff09; 4. C模拟…

Pandas ------ 如果读取带有 multi-index 和 Multi-column 表头的数据

pandas ------ 如果读取带有 multi-index 和 Multi-column 表头的数据 引言正文 引言 之前我们在 《Pandas ------ 向 Excel 文件中写入含有 multi-index 和 Multi-column 表头的数据》 一文中介绍了如何向 Excel 文件中写入含有 multi-index 和 Multi-column 表头的数据。但是…

电脑出现msvcp140.dll丢失错误弹窗怎么办,msvcp140.dll丢失的解决方法

在使用电脑的过程中出现关于“msvcp140.dll丢失”的错误弹窗&#xff0c;电脑出现这样的弹窗是通常或导致电脑中的一些程序不能正常运行&#xff0c;那么有什么办法可以解决这样的错误呢&#xff1f;今天就将和大家说说关于电脑出现msvcp140.dll丢失的解决办法。 一.使用dll修复…

JVM问题排查手册

三万字长文&#xff1a;JVM内存问题排查Cookbook 一、Heap快照 # jmap命令保存整个Java堆&#xff08;在你dump的时间不是事故发生点的时候尤其推荐&#xff09; jmap -dump:formatb,fileheap.bin <pid> # jmap命令只保存Java堆中的存活对象, 包含live选项&#xff0c;…

自动 CAPTCHA 解决方案,最佳 CAPTCHA 解决方案扩展 2024?

自动 CAPTCHA 解决方案&#xff0c;最佳 CAPTCHA 解决方案扩展 2024&#xff1f; 在迅速发展的数字领域中&#xff0c;高效的 CAPTCHA&#xff08;Completely Automated Public Turing tests to tell Computers and Humans Apart&#xff0c;完全自动化的全球公共图灵测试&…

正则表达式第三四个作用:替换、切割

目录 方法二 replaceAll&#xff1a; 方法三&#xff1a;spilt&#xff1a; 方法一之前已经见过了&#xff1a; 方法二 replaceAll&#xff1a; 形参中&#xff1a; 参数regex表示一个正则表达式。可以将当前字符串中匹配regex正则表达式的字符串替换为newStr。 代码演示 S…

什么是线程死锁

死锁是指两个或两个以上的进程&#xff08;线程&#xff09;在执行过程中&#xff0c;由于竞争资 源或者由于彼此通信而造成的一种阻塞的现象&#xff0c;若无外力作用&#xff0c;它们都将无法推 进下去。此时称系统处于死锁状态或系统产生了死锁&#xff0c;这些永远在互相…

SIP PRACK method

PRACK 在rfc 3262中定义。 在RFC3261 中,provisonal response (1xx response)表示所联系的服务器正在执行一些进一步的操作,并且尚未有明确的响应。如果服务器预计需要超过 200 毫秒才能获得最终响应,则会发送 1xx 响应。临时(1xx)响应可以包含消息正文,包括会话描述。 p…

MySQL--删除数据表(6)

MySQL中删除数据表是非常容易操作的&#xff0c;但是你在进行删除表操作时要非常小心&#xff0c;因为执行删除命令后所有数据都会消失。 语法 以下为删除 MySQL 数据表的通用语法&#xff1a; DROP TABLE table_name ; -- 直接删除表&#xff0c;不检查是否存在 或 DROP…

语音方向精典论文品读_HuBERT

英文名称: HuBERT: Self-Supervised Speech Representation Learning by Masked Prediction of Hidden Units 中文名称: HuBERT&#xff1a;通过隐藏单元的屏蔽预测进行自监督语音表示学习 链接: http://arxiv.org/abs/2106.07447v1 代码: https:// github.com/pytorch/fairseq…

DevEco Studio打印console日志

Button("MenuSimple").margin(10).onClick(() > {console.info(打印日志信息);console.info("普通的信息");console.debug("DEBUG级别的信息");console.warn("警告的信息");console.error("错误的信息");router.pushUrl(…

6.Toast(Android)

愿你出走半生,归来仍是少年&#xff01; 环境&#xff1a;.NET 7、MAUI 在Maui开发中使用的Toast太丑了&#xff0c;在android项目中使用时不够看。通过Maui的安卓绑定库可实现将android中已有的包导入到C#项目中使用&#xff0c;借助这个方法就可以使用以前在android原生开发…

Spring Security 之摘要认证

摘要认证 注意: 在现代应用程序中不应该使用摘要认证,因为它不被认为是安全的。最明显的问题是你必须以明文或加密或 MD5 格式存储密码。所有这些存储格式都被认为是不安全的。相反,你应该使用单向自适应密码哈希(如 bCrypt、PBKDF2、SCrypt 等)来存储凭据,而这是摘要认…

线性代数速通

二---矩阵 逆矩阵 抽象矩阵求逆 数字型矩阵求逆 二阶矩阵求逆秒杀 解矩阵方程 方阵 伴随矩阵 三---向量组的线性相关性 线性表示 数字型向量组 线性相关性判断 抽象型向量组 线性相关性判断 向量组的秩与极大无关组 四---线性方程组 齐次方程组 基础解系 通解 非齐…

Mediasoup Demo-v3笔记(一)——框架和Nodejs的基本语法

Medisasop Demo的框架 Nodejs基本语法 后记   个人总结&#xff0c;欢迎转载、评论、批评指正

E5 触发器的定义和应用

一、实验目的: 熟练使用MySQL触发器的定义和应用。 二、实验要求: 1、基本硬件配置:英特尔Pentium III 以上,大于4G内存&#xff1b; 2、软件要求:Mysql&#xff1b; 3、时间:1小时&#xff1b; 4、撰写实验报告并按时提交。 三、实验内容: 问题1&#xff1a;创建触发器…

Docker 魔法解密:探索 UnionFS 与 OverlayFS

本文主要介绍了 Docker 的另一个核心技术&#xff1a;Union File System。主要包括对 overlayfs 的演示&#xff0c;以及分析 docker 是如何借助 ufs 实现容器 rootfs 的。 1. 概述 Union File System Union File System &#xff0c;简称 UnionFS 是一种为 Linux FreeBSD NetB…
最新文章