展开菜单
首页 精品内容 本月促销 装机必备 Windows macOS软件 IOS软件 Android AI PDF教程 专题
全部分类

当前位置:

首页 > 编程开发 > C++实现二叉树的Morris前序遍历零辅助空间算法 _ 深度解析【实战】

C++实现二叉树的Morris前序遍历零辅助空间算法 _ 深度解析【实战】

Morris前序遍历算法通过利用节点的空指针建立临时线索,实现仅用常数额外空间的二叉树遍历。其核心在于判断当前节点的左子树是否存在,并据此进行访问、建立线索或恢复结构,最终高效完成遍历且不改变原树结构。

在二叉树遍历的经典算法中,递归和栈辅助迭代是标准解法,但它们都需要O(n)的额外空间。有没有一种方法,能在不借助栈或递归的情况下,仅用常数额外空间完成遍历呢?答案是肯定的,这就是我们今天要深入探讨的Morris遍历算法。它通过巧妙地“借用”树中节点的空指针来构建临时线索,实现遍历后还能恢复原状,堪称空间优化的典范。下面,我们就聚焦于它的前序遍历版本,拆解其核心思想与实现细节。

C++实现二叉树的Morris前序遍历零辅助空间算法 _ 深度解析【实战】

一、Morris前序遍历核心思想

Morris遍历的精髓在于“临时借用,用完即还”。它利用树中大量叶子节点存在的空右指针(有时是左指针),在遍历过程中构建出一条条临时的“回溯线索”。对于前序遍历,其核心行动逻辑可以概括为:当你抵达一个节点时,如果它有左子树,那么你首先要访问它自己,然后想办法进入左子树探索,并确保探索完毕后能顺利回来。这个“确保回来”的方法,就是在进入左子树前,先找到左子树中最靠右的那个节点(也就是当前节点在中序遍历下的前驱节点),然后把它的空右指针临时指向当前节点,作为回来的路标。如果节点没有左子树,事情就简单了:访问它,然后直接向右走。

具体来说,算法流程遵循以下步骤:

1. 从根节点出发,将其设为“当前节点”。

2. 只要当前节点不为空,就重复以下判断流程:

3. 如果当前节点没有左孩子,那么按照前序“根左右”的顺序,此时就应该访问它。输出节点值后,转向其右孩子继续。

4. 如果当前节点有左孩子,那么就需要找到它左子树中的“最右节点”。

5. 找到这个最右节点后,检查它的右指针:如果为空,说明我们是第一次来到当前节点,尚未建立回溯线索。这时,我们做三件事:将最右节点的右指针指向当前节点(建立线索),访问当前节点(前序访问),然后将当前节点移动到其左孩子,开始探索左子树。

6. 如果最右节点的右指针已经指向当前节点,这说明左子树我们已经探索完毕,正通过这条线索回溯回来。此时,我们需要“过河拆桥”,将最右节点的右指针重新置为空(恢复树的结构),然后当前节点转向其右孩子,继续主流程。

二、C++代码实现细节说明

将上述思想转化为代码,关键在于清晰地区分“首次向下探索”和“回溯向上”这两种状态。判断依据就是左子树最右节点的右指针指向谁。整个实现需要像外科手术一样精确,确保指针操作安全,避免内存错误。

首先,定义基础的二叉树节点结构:

struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

接着,实现前序遍历函数:

vector preorderTra versal(TreeNode* root) {
    vector result;
    TreeNode* curr = root;

    while (curr != nullptr) {
        if (curr->left == nullptr) {
            // 情况1:无左子树,直接访问并向右
            result.push_back(curr->val);
            curr = curr->right;
        } else {
            // 情况2:有左子树,寻找前驱节点
            TreeNode* predecessor = curr->left;
            while (predecessor->right != nullptr && predecessor->right != curr) {
                predecessor = predecessor->right;
            }

            if (predecessor->right == nullptr) {
                // 情况2a:首次到达,建立线索并访问
                predecessor->right = curr;
                result.push_back(curr->val); // 前序访问点
                curr = curr->left;
            } else {
                // 情况2b:回溯至此,恢复结构
                predecessor->right = nullptr;
                curr = curr->right;
            }
        }
    }
    return result;
}

代码中的while循环是查找前驱节点的核心,条件predecessor->right != nullptr && predecessor->right != curr确保了它停在真正的最右节点,且不会因为已存在的线索而陷入循环。

三、关键边界情况处理

一个健壮的算法必须能从容应对各种极端情况。对于Morris前序遍历,需要特别注意以下几点:

1. 空树处理:如果根节点就是nullptr,函数会直接返回空结果容器,外层循环不会进入,这是正确的。

2. 查找前驱的安全条件:查找predecessor的循环条件至关重要。它必须同时检查右指针非空且不指向当前节点,才能正确找到真正的最右叶子或已建立线索的节点。

3. 访问时机:这是前序遍历与中序遍历(Morris更常见的应用)的关键区别。节点值必须在“建立线索”的同时(即第一次到达该节点时)就加入结果集,这正是前序“根左右”中“根”先访问的体现。

4. 结构恢复:当通过predecessor->right == curr判断出处于回溯状态时,必须先将predecessor->right恢复为nullptr,再移动当前节点。这个顺序保证了树的结构在遍历过程中被即时修复,不会影响后续操作或留下错误的指针。

5. 杜绝重复访问:整个算法设计保证了每个节点最多被访问两次(一次向下,一次回溯),但值只被输出一次(在无左子或首次建立线索时)。仔细跟踪流程可以发现,回溯路径上的节点绝不会再次将其值加入结果,这是正确的。

通过以上步骤,Morris前序遍历算法就能在不使用任何额外栈空间的情况下,高效、正确地完成遍历任务。它像一位技艺高超的探险家,在森林(二叉树)中探索时,只在必要的岔路口留下临时标记(线索),并在返回时一一擦除,最终不留下任何痕迹,却走遍了每一个角落。

本文内容来源于互联网,如有侵权请联系删除。
作者最新文章
编程开发 C++
相关文章 更多
精品专题 更多
本月促销

正软商城本月促销专区,汇集办公、设计、安全、影音、系统工具及AI软件等正版软件优惠活动,提供限时折扣、特价授权和优惠购买信息,活动库存及价格以页面实时展示为准。

装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

IOS软件

正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

AI

正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
灵活计算器
灵活计算器

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

赤友清理大师
赤友清理大师

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

图几
图几

图几是一款适用于 macOS 的截图、标注与美化工具,支持离线操作保障隐私。界面整理和高频系统操作被放到一起考虑,桌面或窗口内容一多时,管理起来会更省心。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

Menuist
Menuist

Menuist 是一款面向 macOS 的 Finder 右键菜单增强工具,主要用来补充新建文件、快捷导航等常用操作,让日常文件管理和访问路径时更高效、更顺手。

Mole
Mole

Mole 是一款专为 Mac 设计的深度清理优化工具,涵盖缓存清理、应用管理及实时状态监控等功能。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

WINDOWS 更多
Windows 10
Windows 10

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

傲梅轻松备份
傲梅轻松备份

傲梅轻松备份是一款专业易用的数据备份软件,为重要数据提供安全保障。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

Wise Folder Hider Pro
Wise Folder Hider Pro

Wise Folder Hider Pro 是一款专业级文件和文件夹隐藏加密软件,为私密数据添加多重保护。高频操作更强调就近处理,浏览、整理和跨目录移动文件时,来回切换和重复点击都会少很多。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

PinStack
PinStack

PinStack是一款轻量级的Windows平台剪贴板管理工具,优化您的剪贴板使用体验。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

Seer
Seer

Seer是一款在Win平台下的空格键功能增强效率工具,只需轻敲空格键,就能预览几乎任何格式的文件。它更适合把零散的小功能集中起来使用,处理高频琐碎任务时会更省事。