如何用堆栈实现后序遍历的非递归程序
来源:互联网 发布:mac l2tp服务器未响应 编辑:程序博客网 时间:2024/05/21 17:18
void InOrderTraversal( BinTree BT ){ BinTree T BT; Stack S = CreatStack( MaxSize ); /*创建并初始化堆栈S*/ Stack Q = CreatStack( MaxSize ); /*创建并初始化堆栈Q,用于输出反向*/ while( T || !IsEmpty(S) ){ while(T){ /*一直向右并将沿途结点压入堆栈*/ Push(S,T); Push(Q,T);/*将遍历到的结点压栈,用于反向*/ T = T->Right; } if(!IsEmpty(S)){ T = Pop(S); /*结点弹出堆栈*/ T = T->Left; /*转向左子树*/ } } while( !IsEmpty(Q) ){ T = Pop(Q); printf(“%5d”, T->Data); /*(访问)打印结点*/ }}
先序的访问顺序是root, left, right 假设将先序左右对调,则顺序变成root, right, left,暂定称之为“反序”。
后序遍历的访问顺序为left, right,root ,刚好是“反序”结果的逆向输出。于是方法如下:
1、反序遍历二叉树,具体方法为:将先序遍历代码中的left 和right 对调即可。
数据存在堆栈S中。
2、在先序遍历过程中,每次Push节点后紧接着print结点。
对应的,在反序遍历时,将print结点改为把当前结点 PUSH到堆栈Q中。
3、反序遍历完成后,堆栈Q的压栈顺序即为反序遍历的输出结果。
此时再将堆栈Q中的结果pop并print,即为“反序”结果的逆向,也就是后序遍历的结果。
缺点是堆栈Q的深度等于数的结点数,空间占用较大。
2 0
- 如何用堆栈实现后序遍历的非递归程序
- 用堆栈实现后序遍历的非递归程序
- 二叉树的中序、先序、后序遍历非递归遍历算法(使用堆栈,用循环实现)
- 链式二叉树的后序创建、递归后序遍历、非递归堆栈后序遍历、后序销毁
- 如何用栈实现递归与非递归的转换
- 如何用栈实现递归与非递归的转换
- 如何用栈实现递归与非递归的转换
- 如何用栈实现递归与非递归的转换
- 如何用栈实现递归与非递归的转换
- 如何用栈实现递归与非递归的转换
- 如何用栈实现递归与非递归的转换
- 如何用栈实现递归与非递归的转换
- 如何用栈实现递归与非递归的转换
- 如何用栈实现递归与非递归的转换
- 如何用栈实现递归与非递归的转换(一)三种遍历树的算法
- 数据结构-----后序遍历二叉树非递归算法(利用堆栈实现)
- Binary Tree Postorder Traversal 二叉树的后序遍历,使用堆栈,非递归
- c#非递归实现后序遍历
- ARP地址解析协议与RAPR逆地址解析协议
- 转载----android应用程序中获取view的位置
- Visual Studio 2005/2008中如何编译和运行C++程序
- vim+cscope+ctags打造属于自己的IDE
- 关于算法练习1.1中的中参数传递方式思考
- 如何用堆栈实现后序遍历的非递归程序
- Sizeof与Strlen的区别与联系
- uint8_t / uint16_t / uint32_t /uint64_t 是什么数据类型 - 大总结,看完全明白了
- c++读取word文件
- 利用textField的代理和手势来进行取消第一响应的事件来提高用户体验!
- 多图真相:Adobe Dreamweaver CC 2014.1来了-体验卓越PSD提取和诸多精彩云功能!
- [Leetcode]Excel Sheet Column Number
- 判断大小端模式
- uva11300