【算法与数据结构】二叉树的 后序 遍历
2014-12-01 00:00
260 查看
非递归后序遍历二叉树相对于先序和中序稍微麻烦一点,网上看到好几种解法,
有一种解法很好,见(http://www.cnblogs.com/dolphin0520/archive/2011/08/25/2153720.html)
二叉树
我自己也想到一种解法,不过有个不太好的地方就是每个节点需要借助两个额外的布尔变量来表示该节点的左右子树是否访问(入栈),
二叉树结构如下
非递归后序遍历二叉树的原理如下
代码如下
main函数
执行结果如下
有一种解法很好,见(http://www.cnblogs.com/dolphin0520/archive/2011/08/25/2153720.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 二叉树建立及其前序、中序、后序遍历
- 算法实验-二叉树的创建和前序-中序-后序-层次 遍历
- 一步一步复习数据结构和算法基础-层次建立层次遍历二叉树
- 二叉树的前序、中序、后序遍历的算法(递归形式和非递归形式)
- 【算法与数据结构】二叉树的 中序 遍历
- 数据结构-----后序遍历二叉树非递归算法(利用堆栈实现)
- 数据结构--二叉树--求树的深度的算法(树遍历算法的应用)
- C++数据结构--二叉树的建立,前序遍历,中序遍历和后序遍历
- 二叉树的先序、中序、后序遍历方法(递归与非递归方法)——《数据结构》
- C++编写数据结构中的二叉树(前序,中序,后序遍历)
- 数据结构学习笔记-二叉树的前、中、后序遍历,递归、非递归方式
- 数据结构--二叉树的遍历--复制二叉树(后序遍历)
- 后序遍历二叉树的两种迭代算法
- 数据结构_二叉树_遍历算法应用
- 数据结构与算法学习之二叉树的遍历:已知先序、中序、后序序列三者中的两种求另外一种遍历的算法
- 数据结构--二叉树 的先序,中序,后序遍历
- 二叉树的建立和遍历算法 - 数据结构和算法47
- 【算法与数据结构】二叉树的 先序 遍历
- 数据结构:算法之二叉树各种遍历(申明:转自落日小屋)