如何解决在不使用堆栈或递归的情况下解释 Morris 中序树遍历
如果我正确阅读算法,这应该是它如何工作的示例:
X
/ \
Y Z
/ \ / \
A B C D
首先,X
是根,所以它被初始化为current
。X
有一个左孩子,因此X
成为
的左子树的最右孩子——中序遍历中X
的直接前身。X
所以X
被设为 的右孩子B
,然后current
被设置为Y
。树现在看起来像这样:
Y
/ \
A B
\
X
/ \
(Y) Z
/ \
C D
(Y)
以上是指Y
及其所有子代,由于递归问题而被省略。无论如何,重要的部分都列出来了。现在树有一个返回 X 的链接,遍历继续......
A
\
Y
/ \
(A) B
\
X
/ \
(Y) Z
/ \
C D
thenA
被输出,因为它没有左孩子,并current
返回到Y
,它A
在之前的迭代中是 的右孩子。在下一次迭代中,Y
有两个孩子。然而,循环的双重条件使它在到达自身时停止,这表明它的左子树已经被遍历。因此,它打印自己,并继续其右子树,即B
.
B
打印自己,然后current
变成X
,它经过与之前相同的检查过程Y
,也意识到它的左子树已被遍历,继续Z
. 树的其余部分遵循相同的模式。
不需要递归,因为不是依赖于通过堆栈回溯,而是将返回(子)树根的链接移动到无论如何都将在递归中序树遍历算法中访问它的点——在它之后左子树已经完成。
解决方法
有人可以在不使用堆栈或递归的情况下帮助我理解以下莫里斯中序树遍历算法吗?我试图了解它是如何工作的,但它只是逃避了我。
1. Initialize current as root
2. While current is not NULL
If current does not have left child
a. Print current鈥檚 data
b. Go to the right,i.e.,current = current->right
Else
a. In current's left subtree,make current the right child of the rightmost node
b. Go to this left child,current = current->left
我了解树的修改方式是,current node
是in并使用此属性进行中序遍历。但除此之外,我迷路了。right child``max
node``right subtree
编辑:找到这个随附的 c++ 代码。我很难理解树在修改后是如何恢复的。神奇之处在于else
子句,一旦右叶被修改,就会被击中。详情见代码:
/* Function to traverse binary tree without recursion and
without stack */
void MorrisTraversal(struct tNode *root)
{
struct tNode *current,*pre;
if(root == NULL)
return;
current = root;
while(current != NULL)
{
if(current->left == NULL)
{
printf(" %d ",current->data);
current = current->right;
}
else
{
/* Find the inorder predecessor of current */
pre = current->left;
while(pre->right != NULL && pre->right != current)
pre = pre->right;
/* Make current as right child of its inorder predecessor */
if(pre->right == NULL)
{
pre->right = current;
current = current->left;
}
// MAGIC OF RESTORING the Tree happens here:
/* Revert the changes made in if part to restore the original
tree i.e.,fix the right child of predecssor */
else
{
pre->right = NULL;
printf(" %d ",current->data);
current = current->right;
} /* End of if condition pre->right == NULL */
} /* End of if condition current->left == NULL*/
} /* End of while */
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。