二叉数莫里斯遍历

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;

原理:
考虑普通中序遍历时,是怎么递归的:左->中->右,
当没有右节点时,就会回跳到父节点,回溯就是不断向上跳。
莫里斯遍历的原理是当没有右节点时,将右节点修改为要跳的父节点,
这样就可以直接一步跳回去了。
莫里斯遍历的重要步骤在于这个额外的连接。

前序和后序莫里斯遍历也差不多,只是指针的指法有些不同。

以上是关于二叉数莫里斯遍历的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode145.二叉数的后序遍历

Leetcode144.二叉数的前序遍历

树二叉树存储结构二叉数遍历& 数据结构基本概念和术语

树二叉树存储结构二叉数遍历& 数据结构基本概念和术语

07_2.二叉数,二叉树的简单应用:表达式树

线索二叉树