二叉树的前序、中序、后序的非递归遍历
来源:互联网 发布:insert into 跨数据库 编辑:程序博客网 时间:2024/05/16 11:08
二叉树的数据结构:
typedef int ElementType;
typedef struct Node{ElementType data;Node *left;Node *right;}Node, *Root;
二叉树的遍历是非常重要的树操作,按照节点遍历的顺序,可以分为前序、中序、后序和层次遍历,遍历算法用递归方法实现非常清晰,但是实际应用时采用递归很容易造成堆栈溢出,因此非递归遍历算法就显得非常重要。
非递归其实和递归的原理是一样的,用栈来保存节点信息。
前序遍历(这里用printf来表示对节点信息的访问)
void PreOrderTraverse(Root root){Node temp = root;stack<Node> S;while(temp || !S.empty()){if(temp){S.push(temp);printf("%d", temp->data);//遍历到子树根节点,立即访问temp = temp->left;//一直向左遍历左孩子}else{temp = S.top();S.pop();temp = temp->right;//根节点和左子树都访问过了,接着访问右子树}}}
void InOrderTraverse(Root root){Node temp = root;stack<Node> S;while(temp || !S.empty()){if(temp){S.push(temp);temp = temp->left;//一直向左遍历左孩子}else{temp = S.top();printf("%d", temp->data);S.pop();temp = temp->right;//根节点和左子树都访问过了,接着访问右子树}}}
后序遍历:
void PostOrderTraverse(Root root){Node temp = root;Node pre = NULL;stack<Node> S;while(temp || !S.empty()){if(temp){S.push(temp);temp = temp->left;//一直将左孩子入栈}else{if(S.top()->right && pre != S.top()->right)//如果该节点有右子树,且并未访问过,则首先遍历右子树temp = S.top()->right;else//若该节点没有右子树,或者右子树已经被访问过,则输出当前节点{printf("%d", S.top()->data);pre = S.top();//pre记录被访问的前一个节点S.pop();//被访问过的节点出栈}}}}
层次遍历(顾名思义,就是按照数的层次从左到右进行遍历):
void GraTraverse(Root root){Node temp = root;queue<Node> Q;while(temp || !Q.empty()){printf("%d", temp->data);if(temp->left)//访问节点后将节点的左孩子和右孩子分别入队Q.push(temp->left);if(temp->right)Q.push(temp->right);temp = Q.front();//从队头取下一个访问节点Q.pop();}}
0 0
- 二叉树的非递归【前/中/后 序遍历】
- 前,中,后序遍历二叉树 (递归 && 非递归的栈 && 非递归非栈的线索二叉树)
- 【二叉树】 前序、中序和后序的递归遍历与非递归遍历
- 非递归实现二叉树的后序遍历、前序遍历、中序遍历
- 二叉树的非递归前序、后序遍历
- 二叉树的前序,中序,后序的递归与非递归遍历
- 【二叉树】实现二叉树的前序、中序、后序的非递归遍历
- 二叉树 前序遍历的非递归实现 中序遍历的非递归实现 后序遍历的非递归实现 创建二叉树
- 二叉树的创建,遍历(前序,中序,后序)-递归 非递归
- 二叉树的前序、中序、后序遍历 递归非递归实现
- 二叉树的前序、中序、后序(递归、非递归)遍历java实现
- 数据结构:二叉树的前序,中序,后序遍历(递归和非递归)
- 二叉树的递归和非递归遍历(前序、中序、后序)
- 二叉树的前序、中序、后序遍历(递归&非递归)
- 二叉树的前序、中序、后序遍历(递归与非递归)
- 二叉树的前序,中序,后序遍历(递归非递归实现)
- 实现二叉树的前序/中序/后序递归、非递归遍历
- 二叉树的递归与非递归遍历(前序、中序、后序)
- 第三次作业
- GCD调度群组、信号量与屏障(Barrier)
- 日常问题一二
- WCDMA呼叫流程
- 【ShaderToy】基础篇之再谈抗锯齿(antialiasing,AA)
- 二叉树的前序、中序、后序的非递归遍历
- 面向对象之——“中间操作流”(Builder)
- Python入门——从安装开始
- 守护进程创建
- 二叉树、B orB-树、B+树、B*树
- 网页QQ链接地址
- java两数之间互换
- Customers Who Never Order
- 使用xib创建的自定义UIView 无法进行交互