常量空间遍历二叉树

本文介绍了如何使用Deutsch-Schorr-Waite算法在常量空间内以线性时间遍历二叉树。该算法通过指针反转,在遍历过程中利用二叉树节点的低位存储标记位,巧妙地避免了额外的O(n)空间需求。详细实现代码和相关资源也在内容中给出。
摘要由CSDN通过智能技术生成

我们知道遍历一棵二叉树,无论是先序遍历、中序遍历、后序遍历都需要一个O(n)大小的栈空间(系统栈或程序员控制的栈),或层次遍历需要一个O(n)大小的队列。那么如何在常量空间内遍历呢?

本文介绍Deutsch-Schorr-Waite算法,可以使用常量空间、线性时间遍历任意图。本文主要以二叉树为例(二叉树是特殊的有向图)。

算法的关键是指针反转。当访问过程向下遍历子树时,它“反转”它所经过的指针:在当前结点的某个指针域保存父节点的地址。当访问过程向上回溯时,再恢复所有指针域原有的值。

遍历一棵二叉树的过程中,对于每个被访问的节点,Deutsch-Schorr-Waite算法先将left域改写成指向父节点的反向指针,然后沿着左子树继续向下遍历。在第二次访问的时候父节点的地址被移动right域中,并恢复left域的原值,然后后沿着右子树继续向下遍历。最后一次访问的时候,right域恢复为它的原值,访问过程通过之前保存在right域中的地址返回父节点。对于每个节点,我们需要一个附加的记号位来指明父指针存放在left域中还是right域中。那么这不还是每个节点需要一个位吗?空间还是O(n)的,但是我们可以利用指针域的低位来保存这个标记位。
如二叉树节点定义

struct TreeNode
{
int val;
TreeNode *left;
TreeNo

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值