【算法与数据结构】二叉树的 后序 遍历
2014-05-06 21:06
316 查看
非递归后序遍历二叉树相对于先序和中序稍微麻烦一点,网上看到好几种解法,
有一种解法很好,见(/article/4719934.html)
二叉树
我自己也想到一种解法,不过有个不太好的地方就是每个节点需要借助两个额外的布尔变量来表示该节点的左右子树是否访问(入栈),
二叉树结构如下
非递归后序遍历二叉树的原理如下
代码如下
main函数
执行结果如下
有一种解法很好,见(/article/4719934.html)
二叉树
我自己也想到一种解法,不过有个不太好的地方就是每个节点需要借助两个额外的布尔变量来表示该节点的左右子树是否访问(入栈),
二叉树结构如下
typedef struct _tagBinTree { unsigned char value; struct _tagBinTree* left; struct _tagBinTree* right; bool lbVisited; //其左子树是否访问过(默认为false,非递归后序遍历用到) bool rbVisited; //其右子树是否访问过(默认为false,非递归后序遍历用到) }BinTree, *PBinTree;
非递归后序遍历二叉树的原理如下
/************************************************************************ 非递归后序遍历二叉树原理 首先将根节点入栈 while(栈不空) { 取栈顶元素a if(a不为NULL) { if(a左子树没有访问过) { a左子树入栈,标明a的左子树访问过 } //左子树访问过 else if(a右子树没有访问过) { a右子树入栈,表明a的右子树访问过 } //a的左右子树均访问过,访问根节点,然后将a出栈 else { Visit(a); Pop(a); } } //栈顶元素为NULL,将其出栈 else { Pop(a); } } ************************************************************************/
代码如下
void PostOrderTraverse(PBinTree& pRoot) { stack<PBinTree> stPBinTree; stPBinTree.push(pRoot); while (! stPBinTree.empty()) { //取栈顶元素 PBinTree pNode = stPBinTree.top(); //栈顶元素不为NULL if (NULL != pNode) { //如果其左子树没有访问过 if (false == pNode->lbVisited) { //将其左子树入栈,并标明其左子树访问过 stPBinTree.push(pNode->left); pNode->lbVisited = true; } //如果其右子树没有访问过 else if (false == pNode->rbVisited) { //将其右子树入栈,并标明其右子树访问过 stPBinTree.push(pNode->right); pNode->rbVisited = true; } //其左右子树均已经访问过 else { //访问其节点,并将其出栈 Visit(pNode); stPBinTree.pop(); } } //栈顶元素为NULL else { //直接将栈顶为NULL的元素出栈 stPBinTree.pop(); } } }
main函数
cout << "\r\n-----------开始 非递归后序遍历二叉树---------------\r\n"; PostOrderTraverse(pRoot); cout << "\r\n-----------结束 非递归后序遍历二叉树---------------\r\n\r\n";
执行结果如下
相关文章推荐
- 【算法与数据结构】二叉树的 后序 遍历
- [算法与数据结构] - No.7 二叉树建立及其前序、中序、后序遍历
- 二叉树的遍历 - 数据结构和算法46
- 笔试算法题(36):寻找一棵二叉树中最远节点的距离 & 根据二叉树的前序和后序遍历重建二叉树
- [置顶] 数据结构——二叉树 前序、中序、后序、递归遍历和非递归遍历
- 数据结构(六)——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- [C/C++] 先序建立二叉树| 先序、中序、后序遍历二叉树| 求二叉树深度、节点数、叶节点数 算法实现
- 一步一步复习数据结构和算法基础-层次建立层次遍历二叉树
- 数据结构--二叉树的遍历--求二叉树的深度(后序遍历)
- 二叉树的遍历 - 数据结构和算法46
- 数据结构:题目(3)测试一个数组序列是否是二叉树的前序遍历或者后序遍历结果
- 【数据结构】二叉树的前中后序遍历递归和非递归实现
- 数据结构学习心得——二叉树的三种遍历算法
- 算法题25 二叉树的后序遍历变形之二叉树中和为某一值的路径
- 数据结构:二叉树前序、中序和后序遍历的非递归表示
- 数据结构:算法之二叉树各种遍历(申明:转自落日小屋)
- 数据结构二叉树的实现,前序、中序、后序遍历
- 【数据结构】二叉树前序、中序、后序遍历相互求法
- 数据结构_二叉树的先序建立与先序,中序,后序(递归)遍历方式_C语言源代码
- 【算法与数据结构】二叉树的 先序 遍历