Morris遍历最主要的特点是不需要堆栈,其空间复杂度为O(1),算法的核心步骤在于,找到当前节点左子树的最右节点,将该节点的右指针指向当前节点,从而在进入左子树之后,可以循此虚拟的连接回到当前节点。在左子树访问结束后,还要消除该虚拟连接,恢复原二叉树的结构。
Morris遍历的C++代码结构如下:
TreeNode *cur, *prev;
cur = root;
while (cur != nullptr) {
if (cur->left == nullptr) {
//do sth.
prev = cur; /* */
cur = cur->right;
}
else {
TreeNode *node = cur->left;
while (node->right != nullptr && node->right != cur)
node = node->right;
if (node->right == nullptr) {
//visit cur
node->right = cur;
//prev = cur; //only if cur is just visited here
cur = cur->left;
} else { /*left has finished*/
node->right = nullptr;
// prev = cur; //only if cur is just visited here
cur = cur->right;
}
}
}