空间复杂度o(1) 意味着不用栈,不用递归从而来遍历 很强 利用到了线索二叉树的算法感觉
打一下代码 可能和别的老哥帖子中代码有点像 边看边打的
void Moris(TreeNode* root) //O(1)空间中序遍历二叉树
{
TreeNode* cur=root; //cur为当前节点
while(cur)
{
if(!cur->left)
{
cout<<cur;
cur=cur->left;
}
else //有左子树
{
TreeNode* pre=cur->left; //pre代表 在中序遍历中cur的前驱节点 下面的循环就是找到pre
while(pre->right&&pre->right!=cur) //要么为空 要么pre->right为cur 后者是因为我设置过的
pre=pre->right; //pre初始化完成
if(!pre->right) //pre->right为空 代表我还没设置操作过
{
pre->right=cur; //关于cur节点的前驱我已经设置完成 已经令cur的前驱的right等于cur了
cur=cur->left; //我该继续访问现在cur节点的左子树了
}
else //我已经设置过了 所以我要恢复二叉树
{
pre->right=NULL; //恢复 此时 cur的左子树已经访问完成
cout<<cur;
cur=cur->right; //该访问右子树了
}
}
}
}