二叉树的前序、中序、后序、层序非递归遍历
2014-05-02 21:06
246 查看
今天没有时间把整个二叉树整理出来了,改天吧,先把这四个遍历写出来。
前序遍历伪代码:
1、栈S初始化,p指向root
2、循环直到p为空且栈S为空
2.1当p不为空时循环
2.1.1 输出p->data;
2.1.2将指针p保存在栈中
2.1.3继续遍历p的左子树
2.2如果栈S不空
2.2.1将栈顶元素弹出至p
2.2.2准备辩论p的右子数
中序遍历跟前序遍历差不多,只是把cout<<p->data移到p=S.top();后就可以了。
后序遍历:
在后续非递归遍历中,每个结点要出两次的栈,其含义与处理方法为:
1.第一次出栈:只遍历左子树,右子树尚未遍历,则该结点不出栈,利用栈顶结点找到它的右子树,准备遍历它的右子树。
2.第二次出栈:遍历完右子树,将该结点出栈,并访问之。
因此,为了区分同一个结点的两次出栈,设置标志flag,令:
flag = 1,第一次出栈,只遍历完左子树,该结点不能访问;
flag=2,第二次出栈,遍历完右子树,该结点可以访问;
则栈元素的类型定义如下:
struct Element
{
BiNode * ptr;
int flag;
};
伪代码:
1.栈S初始化
2.循环直到p为空且栈S为空
2.1当p非空时循环
2.1.1将p连同标志flag=1入栈
2.1.2继续遍历p的左子树
2.2当栈S非空且栈顶元素的标志位为2时,出栈并输出结点。
2.3若栈非空,将栈顶的标志改为2,准备遍历栈顶结点的右子树。
层序遍历:
只需要一个队列就可以了;
伪代码:
1.队列初始化
2.如果二叉树非空,跟结点入队
3.循环直到队列为空
3.1q=Q出队
3.2打印数据
3.2如果左子树不为空,左子树入对
3.3如果右子树不为空,右子树入队
前序遍历伪代码:
1、栈S初始化,p指向root
2、循环直到p为空且栈S为空
2.1当p不为空时循环
2.1.1 输出p->data;
2.1.2将指针p保存在栈中
2.1.3继续遍历p的左子树
2.2如果栈S不空
2.2.1将栈顶元素弹出至p
2.2.2准备辩论p的右子数
void PreOrder(BiNode *root) { stack<BiNode *> S; BiNode *p = root; while (p != NULL || !S.empty()) { while (p != NULL) { cout << p->data; S.push(p); p = p->lchild; } if (!S.empty()) { p = S.top(); S.pop(); p = p->rchild; } } }
中序遍历跟前序遍历差不多,只是把cout<<p->data移到p=S.top();后就可以了。
后序遍历:
在后续非递归遍历中,每个结点要出两次的栈,其含义与处理方法为:
1.第一次出栈:只遍历左子树,右子树尚未遍历,则该结点不出栈,利用栈顶结点找到它的右子树,准备遍历它的右子树。
2.第二次出栈:遍历完右子树,将该结点出栈,并访问之。
因此,为了区分同一个结点的两次出栈,设置标志flag,令:
flag = 1,第一次出栈,只遍历完左子树,该结点不能访问;
flag=2,第二次出栈,遍历完右子树,该结点可以访问;
则栈元素的类型定义如下:
struct Element
{
BiNode * ptr;
int flag;
};
伪代码:
1.栈S初始化
2.循环直到p为空且栈S为空
2.1当p非空时循环
2.1.1将p连同标志flag=1入栈
2.1.2继续遍历p的左子树
2.2当栈S非空且栈顶元素的标志位为2时,出栈并输出结点。
2.3若栈非空,将栈顶的标志改为2,准备遍历栈顶结点的右子树。
struct Element { BiNode * ptr; int flag; }; void PostOrder(BiNode *root) { stack<Element> S; BiNode * p = root; while (root != NULL || !S.empty()) { Element e; e.ptr = p; e.flag = 1; S.push(e); p = p->lchild; } while (!S.empty() && S.top().flag == 2) { p = S.top().ptr; S.pop(); cout << p->data; } if (!S.empty()) { S.top().flag = 2; p = S.top().ptr->rchild; } }
层序遍历:
只需要一个队列就可以了;
伪代码:
1.队列初始化
2.如果二叉树非空,跟结点入队
3.循环直到队列为空
3.1q=Q出队
3.2打印数据
3.2如果左子树不为空,左子树入对
3.3如果右子树不为空,右子树入队
void LeverOrder(BiNode *root) { if (root == NULL) return; queue<BiNode*> Q; Q.push(root); while (!Q.empty()) { BiNode *p = Q.front(); Q.pop(); cout << p->data; if (!p->lchild) Q.push(p->lchild); if (!p->rchild) Q.push(p->rchild); } }
相关文章推荐
- 二叉树的先序、中序、后序、层序递归及非递归遍历
- 二叉树的先序、中序、后序、层序递归及非递归遍历
- 二叉树的非递归遍历(前序,中序,后序和层序遍历)
- C++实现二叉树的递归遍历与非递归遍历(先序、中序、后序、层序)
- 二叉树的前序、中序、后序、层序遍历
- 非递归遍历二叉树(先序、中序、后序、层序)
- 二叉树基本操作的递归实现(二叉树建立,先序,中序,后序,深度的递归遍历。广度优先,高度优先的非递归遍历)
- 由二叉树的先序和中序遍历生成二叉树的层序和后序遍历结构
- Java实现二叉树的前序、中序、后序、层序遍历(非递归方法)
- 二叉树的创建及前序、中序、后序、层序遍历
- 二叉树的前序、中序、后序和层序遍历
- 二叉树的链式存储结构 前序 后序 中序 层序遍历操作实现 判断是否完全二叉树
- 二叉树的遍历:前序,中序,后序,层序--包括递归和非递归实现(转)
- 二叉树的先序、中序、后序非递归遍历(C++版)
- 遍历二叉树(前序、中序、后序、层序)
- 动态二叉树的先序、中序、后序和层序遍历及转换为静态二叉树
- 二叉树的遍历:前序,中序,后序,层序--包括递归和非递归实现
- 二叉树简单归纳(前序,中序,后序,层序遍历,叶子数目,树深度 )
- 非递归遍历二叉树的四种策略-先序、中序、后序和层序
- 二叉树的遍历——前序,中序,后序,层序