二叉数莫里斯遍历
Posted live4m
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉数莫里斯遍历相关的知识,希望对你有一定的参考价值。
问题:
中序遍历二叉树,要求时间复杂度O(n),空间复杂度O(1)。
中序莫里斯遍历:
需要暂时修改树的结构(最后可以复原)
为了满足空O(1)空间,不允许使用临时栈和递归栈。
遍历过程:
vector<int>ans;//存放中序遍历序列
TreeNode* now=root;
while(now)
if(now->left==NULL)//左节点为空时,比较好理解
ans.push_back(now->val);
now=now->right;
else//左节点不为空时
TreeNode* last=now->left;
while(last->right&&last->right!=now)//找到左子树的右下角
last=last->right;
if(last->right==NULL)//建立这个点到now的连接
last->right=now;
now=now->left;//然后正常递归处理左节点
else//last->right=now
ans.push_back(now->val);
last->right=NULL;//还原节点
now=now->right;
return ans;
原理:
考虑普通中序遍历时,是怎么递归的:左->中->右,
当没有右节点时,就会回跳到父节点,回溯就是不断向上跳。
莫里斯遍历的原理是当没有右节点时,将右节点修改为要跳的父节点,
这样就可以直接一步跳回去了。
莫里斯遍历的重要步骤在于这个额外的连接。
前序和后序莫里斯遍历也差不多,只是指针的指法有些不同。
以上是关于二叉数莫里斯遍历的主要内容,如果未能解决你的问题,请参考以下文章