二叉树的非递归遍历
来源:互联网 发布:顶点网络微博平台代理 编辑:程序博客网 时间:2024/06/13 11:25
原文地址: http://blog.163.com/zhaohai_1988/blog/static/2095100852012824102839566/
以前写过一个二叉树的后续遍历的迭代版本,其实实现的方法有很多种,今天对二叉树的所有遍历方法都做一个补全。递归版本的太简单了,就不写了,只记录下迭代版本的遍历方法。
- //非递归先序遍历树
- void preOrder(Node* root)
- {
- stack<Node*> s;
- Node* p=NULL;
- if(root==NULL) return;
- s.push(root);
- while(!s.empty())
- {
- p=s.top(); s.pop();
- cout<<p->data<<" ";
- if(p->right) s.push(p->right);
- if(p->left) s.push(p->left);
- }
- }
- //非递归先序遍历树
- void preOrder(Node* t)
- {
- stack<Node*> s;
- Node* p=t;
- while (p!=NULL || !s.empty())
- {
- while (p!=NULL) //遍历左子树
- {
- cout<<p->data<<" ";
- s.push(p);
- p=p->left;
- }
- if (!s.empty()) //通过下一次循环中的内嵌while实现右子树遍历
- {
- p=s.top();
- s.pop();
- p=p->right;
- }
- }
- }
- /*非递归中序遍历树算法:从根节点开始,只要当前节点存在,或者栈不为空,则重复下面操作:
- (1)如果当前节点存在,则进栈并走左子树。
- (2)否则退栈并访问,然后走右子树。
- */
- void inOrder(Node* t)
- {
- stack<Node*> s;
- Node* p=t;
- while(p||!s.empty())
- {
- if(p)
- {
- s.push(p);
- p=p->left;
- }
- else
- {
- p=s.top();s.pop();
- cout<<p->data<<" ";
- p=p->right;
- }
- }
- }
- /*非递归后序遍历树:后序遍历,先遍历到的结点最后访问
- 用两个栈,一个栈用来遍历,另一个栈保存遍历到的结点,最后一起出栈,就是后序遍历结果
- */
- void postOrder(Node* root)
- {
- stack<Node*> sTraverse,sVisit;
- Node* p=NULL;
- if(root==NULL) return;
- sTraverse.push(root);
- while(!sTraverse.empty())
- {
- p=sTraverse.top(); sTraverse.pop();
- sVisit.push(p);
- if(p->left) sTraverse.push(p->left);
- if(p->right) sTraverse.push(p->right);
- }
- while(!sVisit.empty())
- {
- p=sVisit.top(); sVisit.pop();
- cout<<p->data<<" ";
- }
- }
- /*非递归后序遍历树算法:从根节点开始,只要当前节点存在,或者栈不为空,则重复下面操作:
- (1)从当前节点开始,进栈并走左子树,直到左子树为空。
- (2)如果栈顶节点的右子树为空,或者栈顶节点的右孩子为刚访问过的节点,
- 则退栈并访问,然后置当前节点指针为空。
- (3)否则走右子树。
- */
- void postOrder(Node* t)
- {
- Node *p,*q;
- stack<Node*> s;
- p=t;
- q=NULL;
- while(p!=NULL||!s.empty())
- {
- while(p!=NULL)
- {
- s.push(p); p=p->left;
- }
- if(!s.empty())
- {
- p=s.top();
- if((p->right==NULL) || (p->right==q))
- {
- cout<<p->data<<" ";
- q=p;
- s.pop();
- p=NULL;
- }
- else p=p->right;
- }
- }
- }
- /*根节点到r节点的路径:
- 后序遍历时访问到r节点时,栈中的所有的节点均为r节点的祖先,这些祖先构成根节点到r节点的路径
- */
- void nodePath(Node* root,Node* r)
- {
- Node *p,*q;
- stack<Node*> s;
- p=root;
- q=NULL; //q保存刚访问过的节点
- while(p!=NULL||!s.empty())
- {
- while(p!=NULL)
- {
- s.push(p); p=p->left;
- }
- if(!s.empty())
- {
- p=s.top();
- if( (p->right==NULL) || (p->right==q) )
- {
- if(p==r)
- {
- while(!s.empty())
- {
- Node* t=s.top();
- s.pop();
- cout<<t->value<<" ";
- }
- return;
- }
- else
- {
- q=p;
- s.pop();
- p=NULL;
- }
- }
- else p=p->right;
- }
- }
- }
0 0
- 二叉树的递归,非递归遍历
- 二叉树的递归+非递归遍历
- 二叉树的递归非递归遍历
- 二叉树的遍历--递归+非递归
- 二叉树的递归、非递归遍历
- 二叉树的递归非递归遍历
- 二叉树的先中后序遍历,递归遍历,非递归遍历
- 二叉树的递归遍历与非递归遍历
- 二叉树的创建,递归遍历,非递归遍历
- 二叉树的递归遍历与非递归遍历
- 二叉树的非递归遍历以及递归遍历
- 二叉树的非递归遍历&递归遍历
- 二叉树的递归遍历和非递归遍历
- 二叉树的递归遍历与非递归遍历
- 二叉树的递归遍历和非递归遍历
- 二叉树的构造,递归遍历,非递归遍历
- 二叉树的遍历(递归+非递归+层次遍历)
- 二叉树的递归遍历与非递归遍历
- C#中对文件的操作
- 如何不编程也能使用爬虫采集图片或图片地址
- POJ 1011 (DFS)
- php 文件上传出现乱码问题
- 调用系统 隐式intent
- 二叉树的非递归遍历
- iOS 获取年月日
- Qt Creator中.pro跨平台(Win32\Linux)的写法
- android 之MTV
- Set接口
- 安卓开发:解析JSON格式数据
- 游戏制作之路:游戏引擎选择、Mac下和Windows下UnrealEngine 4体验对比、文档及其他 -- 前几天我说要学做游戏的流程...
- 对于定义"int *p",下列哪些说明可能是正确的?----腾讯2016研发工程师在线模拟笔试题
- javaScript对象里面组装数组,数组组装对象