非递归中序遍历非线索二叉树不用栈?
大家都很熟悉用递归和堆栈来实现二叉树的遍历,比如,前序遍历,中序遍历,后序遍历。但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中序遍历。网上有完整的代码。自行搜之。
推荐阅读
- 求助。php无限极分类。递归。咋数出来。每一个分类下面的小分类个数啊。希望有个demo谢谢!
- 为啥说加法是原始递归的
- 这个递归算法能得到所有真分数吗
- 医指通找回密码是啥设计思路
- bfs,dfs怎样保存路径?
- 编程有必要学递归吗?
- 怎样将递归转化成循环
- 案例-怎样用 UML 设计一个简单的工作流引擎(含递归算法)?
- 二叉树的前中后序遍历的空间复杂度是O(logN)
- 目前哪些背单词的网站,能提供熟词预测的功能以减少首次背诵线性遍历的时间