二叉树前序、中序、后序非递归遍历
2017-02-15 16:10
337 查看
我们知道二叉树的递归遍历写起来很简单,但是稍微不太容易理解。为了更好地理解二叉树的遍历过程,这里用栈来模拟递归的步进步出。
构造的树是:
![](http://img.blog.csdn.net/20170215160745457)
程序运行结果:
#include<iostream> #include<cstdio> #include<vector> #include<algorithm> #include<cmath> #include<string> #include<cstring> #include<stack> #include<queue> #include<map> #include<set> #include<unordered_set> #include<unordered_map> using namespace std; typedef struct BiTNode { char data; struct BiTNode *lchild, *rchild; //左右孩子 }BiTNode, *BiTree; //按先序遍历创建二叉树 //BiTree *CreateBiTree() //返回结点指针类型 //void CreateBiTree(BiTree &root) //引用类型的参数 void CreateBiTree(BiTNode **root) //二级指针作为函数参数 { char ch; //要插入的数据 cin>>ch; if (ch == '#') *root = NULL; else { *root = (BiTNode *)malloc(sizeof(BiTNode)); (*root)->data = ch; printf("请输入%c的左孩子:", ch); CreateBiTree(&((*root)->lchild)); printf("请输入%c的右孩子:", ch); CreateBiTree(&((*root)->rchild)); } } //前序遍历的递归算法程序 void PreOrder(BiTNode *root) { if (root == NULL) return; printf("%c ", root->data); //输出数据 PreOrder(root->lchild); //递归调用,前序遍历左子树 PreOrder(root->rchild); //递归调用,前序遍历右子树 } //前序遍历的非递归算法程序 void Pre_NoRecursion(BiTNode* root) { stack<BiTNode*>sta; BiTNode * p = root; while (p||!sta.empty()) { if (p)// if/else可以保证一直寻找到“最左下角的节点 { cout << p->data<<" "; //保证先序 sta.push(p); p = p->lchild; } else //左孩子为空,访问右节点 { p = sta.top(); sta.pop(); p = p->rchild; } } } //中序遍历的递归算法程序 void InOrder(BiTNode *root) { if (root == NULL) return; InOrder(root->lchild); //递归调用,前序遍历左子树 printf("%c ", root->data); //输出数据 InOrder(root->rchild); //递归调用,前序遍历右子树 } //中序遍历的非递归算法程序 void In_NoRecursion(BiTNode* root) { BiTNode * p = root; stack<BiTNode*> sta; while (p || !sta.empty()) { if (p) { sta.push(p); p = p->lchild; } else { p = sta.top(); cout << p->data<<" "; sta.pop(); p = p->rchild; } } } //后续遍历的非递归算法程序 void Post_NoRecursion(BiTNode* root) { BiTNode *p = root; BiTNode *pre = NULL;//用来记录当前访问节点的上一个节点 stack<BiTNode*> sta; while (p || !sta.empty()) { while (p) { sta.push(p); p = p->lchild; } p = sta.top(); //访问当前节点需要满足以下两个条件之一: //1:当前节点的右孩子为空;2:或者右孩子已经访问过. if (p->rchild == NULL || p->rchild == pre) { cout << p->data << " "; pre = p; sta.pop(); p = NULL; } else p = p->rchild; } } int main() { BiTNode *root = NULL; CreateBiTree(&root); PreOrder(root); cout << endl; Pre_NoRecursion(root); cout << endl; InOrder(root); cout << endl; In_NoRecursion(root); cout << endl; Post_NoRecursion(root); return 0; }
构造的树是:
程序运行结果:
相关文章推荐
- 输入前序/后序+中序 遍历结果重建二叉树(递归)
- 通过二叉树的中序和后序遍历序列构造二叉树(非递归)
- 输入完全二叉树的先序序列,用#代表虚结点(空指针),如ABD###CE##F##,建立二叉树的二叉链表。 (2)写出对用二叉链表存储的二叉树进行先序、中序和后序遍历的递归和非递归算法。 (3)写出
- 二叉树先序,中序,后序遍历非递归实现
- 数据结构 ——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 二叉树的遍历:前序、中序、后序、层序的非递归实现
- 二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 二叉树先序、中序,后序遍历的非递归实现
- 二叉树先序、中序、后序遍历的非递归实现
- 二叉树先序、中序、后序、层序遍历(递归、非递归)
- [leet code ] 二叉树非递归前序 中序,后序遍历
- 二叉树的前序、中序、后序遍历非递归实现
- 二叉树2:层次遍历方式及先序、中序、后序(递归与非递归)遍历方式
- 二叉树的前序,中序,后序遍历的非递归实现
- Java实现二叉树的前序、中序、后序、层序遍历(递归方法)
- 二叉树的遍历:前序,中序,后序,层序--包括递归和非递归实现
- 非递归遍历二叉树的四种策略-先序、中序、后序和层序
- 二叉树前序、中序、后序遍历非递归写法的透彻解析
- 二叉树(15)----由中序遍历和后序遍历重建二叉树,递归方式
- 二叉树的先序、中序、后序非递归遍历的实现