利用栈实现二叉树的先序,中序,后序遍历的非递归操作
来源:互联网 发布:网络摄像头监控安装 编辑:程序博客网 时间:2024/05/03 12:35
中序遍历
void inOrder(BiTree T,void(*vist)( element e)){stack<Bitree> S;while (true){if (T) { s.push(T);T=T->Lchild;}else {T=s.pop(s); visit(T);T=T->Rchild;}if(s.empty()) break;}}
先序遍历
void inOrder(BiTree T,void(*vist)( element e)){stack<Bitree> S;while(true){if(T){ visit(T);if(T->rChild) s.push(T->rChild);T=T->lChild;}else {T=s.pop();}}if (s.empty()) break;}
void inOrder(BiTree T,void(*vist)( element e)){stack<Bitree> S;int flat[20];while(true){while(true){s.push(T);T=T->lChild; flag(s.size()]=0;if (!T){ T=->rChild; if (T) flag[s.size()]=1; else break;}while (true){ if(flag[s.size()]){ T=s.pop(); visit(T);}else T=T->rChild;}if (s.empty()) break;}}
这三个都属于深度优先
还有广度优先的遍历,利用队列解决。
下面是转的
利用栈实现二叉树的先序,中序,后序遍历的非递归操作
- #include <stdio.h>
- #include <malloc.h>
- #include <stdlib.h>
- #include <queue>
- #include <stack>
- #include <iostream>
- using namespace std;
- typedef struct BiTNode{
- char data;
- BiTNode *lchild, *rchild;
- }BiTNode,*BiTree;
- void CreateBiTree(BiTree &T)//建树,按先序顺序输入节点
- {
- char ch;
- scanf("%c",&ch);
- if(ch==' ')
- {
- T=NULL;
- return;
- }
- else
- {
- T=(BiTree)malloc(sizeof(BiTNode));
- if(!T)
- exit(1);
- T->data=ch;
- CreateBiTree(T->lchild);
- CreateBiTree(T->rchild);
- }
- }
- void InOrderTraverse(BiTree T)//非递归中序遍历
- {
- stack<BiTree> Stack;
- if(!T)
- {
- printf("空树!\n");
- return;
- }
- while(T || !Stack.empty())
- {
- while(T)
- {
- Stack.push(T);
- T=T->lchild;
- }
- T=Stack.top();
- Stack.pop();
- printf("%c",T->data);
- T=T->rchild;
- }
- }
- void PreOrderTraverse(BiTree T)//非递归先序遍历
- {
- stack<BiTree> Stack;
- if(!T)
- {
- printf("空树!\n");
- return;
- }
- while(T || !Stack.empty())
- {
- while(T)
- {
- Stack.push(T);
- printf("%c",T->data);
- T=T->lchild;
- }
- T=Stack.top();
- Stack.pop();
- T=T->rchild;
- }
- }
- void PostOrderTraverse(BiTree T)//非递归后序遍历,用一个标记标记右子树是否访问过
- {
- int flag[20];
- stack<BiTree> Stack;
- if(!T)
- {
- printf("空树!\n");
- return;
- }
- while(T)
- {
- Stack.push(T);
- flag[Stack.size()]=0;
- T=T->lchild;
- }
- while(!Stack.empty())
- {
- T=Stack.top();
- while(T->rchild && flag[Stack.size()]==0)
- {
- flag[Stack.size()]=1;
- T=T->rchild;
- while(T)
- {
- Stack.push(T);
- flag[Stack.size()]=0;
- T=T->lchild;
- }
- }
- T=Stack.top();
- printf("%c",T->data);
- Stack.pop();
- }
- }
- void main()
- {
- BiTree T;
- CreateBiTree(T);
- PreOrderTraverse(T);
- printf("\n");
- InOrderTraverse(T);
- printf("\n");
- PostOrderTraverse(T);
- printf("\n");
- }
- 利用栈实现二叉树的先序,中序,后序遍历的非递归操作
- 利用栈实现二叉树的先序,中序,后序遍历的非递归操作
- 二叉树的先序、中序、后序遍历的递归和非递归实现
- 二叉树的先序、中序、后序遍历的非递归实现
- 二叉树遍历的非递归算法(先序、中序、后序)代码实现
- c语言原生实现二叉树的 非递归 中序 先序 后序 遍历
- 二叉树的先序、中序、后序递归遍历和非递归遍历
- 建立二叉树,实现二叉树的先序遍历、中序和后序遍历的非递归算法
- C++实现二叉树的递归遍历与非递归遍历(先序、中序、后序、层序)
- 二叉树高度,栈实现二叉树的先序,中序,后序遍历的非递归遍历,二叉树层次遍历
- 二叉树的先序、中序、后序的递归及非递归实现,以及层次遍历的实现:
- 二叉树的相关操作+先序(中序,后序)遍历 + 非递归中序遍历
- 二叉树的创建(先序创建的)及先序遍历 中序遍历 后序遍历的递归和非递归实现
- 二叉树的后序,先序,中序遍历的非递归遍历
- java 实现二叉树的构建,先序,中序,后序,层次,递归,非递归的遍历
- 递归和非递归的方式实现二叉树的先序、中序和后序遍历
- 二叉树的先序、中序、后序、层序递归及非递归遍历
- 二叉树的先序/中序/后序(递归、非递归)+层序遍历
- 在ubuntu12.4上安装minigui3.0.12
- 计算机基础,原来是这样滴啊
- 商城中商品筛选的SQL查询组合语句的实现,表结构、传值都完成!
- struts2配置文件详解
- C++库研究笔记——一个类型重复问题的两种解决方法(方法1的缺点补充)
- 利用栈实现二叉树的先序,中序,后序遍历的非递归操作
- 郑州的十一黄金周
- Framework中的TelephonyManager(原)
- yii curd
- c语言 链表实现堆栈
- 广播机制传值 iOS NSNotification
- Visual Assist 快捷键
- Shiro-1.2.2内置的FilterChain
- UVA 1449 Dominating Patterns