非递归中序遍历非线索二叉树不用栈?

大家都很熟悉用递归和堆栈来实现二叉树的遍历,比如,前序遍历,中序遍历,后序遍历。但Morris 遍历,使用无堆栈,O(1) 空间进行二叉树遍历。它的原理很简单,利用所有叶子结点的右指针,指向其后继结点,组成一个环,在第二次遍历到这个结点时,由于其左子树已经遍历完了,则访问该结点。算法伪码:MorrisInOrder():while 没有结束 如果当前节点没有左后代 访问该节点 转向右节点 否则 找到左后代的最右节点,且使最右节点的右指针指向当前节点 转向左后代节点C++实现:void bst_morris_inorder(struct bst_node *root) { struct bst_node *p = root, *tmp; while (p) { if (p-\u0026gt;left == NULL) { printf("%d ", p-\u0026gt;key); p = p-\u0026gt;right; } else { tmp = p-\u0026gt;left; while (tmp-\u0026gt;right != NULL \u0026amp;\u0026amp; tmp-\u0026gt;right != p) tmp = tmp-\u0026gt;right; if (tmp-\u0026gt;right == NULL) { tmp-\u0026gt;right = p; p = p-\u0026gt;left; } else { printf("%d ", p-\u0026gt;key); tmp-\u0026gt;right = NULL; p = p-\u0026gt;right; } } } } 转自http://bbs.chinaunix.net/thread-4093579-1-1.html
■网友
Morris中序遍历。网上有完整的代码。自行搜之。


    推荐阅读