二叉树先序、中序、后序三种遍历的…
2013-08-08 13:25
190 查看
本贴给出二叉树先序、中序、后序三种遍历的非递归算法,此三个算法可视为标准算法。
1.先序遍历非递归算法
#define maxsize 100
typedef struct
{
Bitree
Elem[maxsize];
int top;
}SqStack;
void PreOrderUnrec(Bitree t)
{
SqStack s;
StackInit(s);
p=t;
while (p!=null ||
!StackEmpty(s))
{
while
(p!=null)
//遍历左子树
{
visite(p->data);
push(s,p);
p=p->lchild;
}//endwhile
if
(!StackEmpty(s))
//通过下一次循环中的内嵌while实现右子树遍历
{
p=pop(s);
p=p->rchild;
}//endif
}//endwhile
}//PreOrderUnrec
2.中序遍历非递归算法
#define maxsize 100
typedef struct
{
Bitree
Elem[maxsize];
int top;
}SqStack;
void InOrderUnrec(Bitree t)
{
SqStack s;
StackInit(s);
p=t;
while (p!=null ||
!StackEmpty(s))
{
while
(p!=null)
//遍历左子树
{
push(s,p);
p=p->lchild;
}//endwhile
if
(!StackEmpty(s))
{
p=pop(s);
visite(p->data);
//访问根结点
p=p->rchild;
//通过下一次循环实现右子树遍历
}//endif
}//endwhile
}//InOrderUnrec
3.后序遍历非递归算法
#define maxsize 100
typedef enum{L,R} tagtype;
typedef struct
{
Bitree ptr;
tagtype tag;
}stacknode;
typedef struct
{
stacknode
Elem[maxsize];
int top;
}SqStack;
void PostOrderUnrec(Bitree t)
{
SqStack s;
stacknode x;
StackInit(s);
p=t;
do
{
while
(p!=null)
//遍历左子树
{
x.ptr =
p;
x.tag =
L;
//标记为左子树
push(s,x);
p=p->lchild;
}
while
(!StackEmpty(s) &&
s.Elem[s.top].tag==R)
{
x =
pop(s);
p =
x.ptr;
visite(p->data);
//tag为R,表示右子树访问完毕,故访问根结点
}
if
(!StackEmpty(s))
{
s.Elem[s.top].tag =R;
//遍历右子树
p=s.Elem[s.top].ptr->rchild;
}
}while
(!StackEmpty(s));
}//PostOrderUnrec
转自:http://www.cnblogs.com/baoyu/archive/2005/08/29/225486.html
1.先序遍历非递归算法
#define maxsize 100
typedef struct
{
Bitree
Elem[maxsize];
int top;
}SqStack;
void PreOrderUnrec(Bitree t)
{
SqStack s;
StackInit(s);
p=t;
while (p!=null ||
!StackEmpty(s))
{
while
(p!=null)
//遍历左子树
{
visite(p->data);
push(s,p);
p=p->lchild;
}//endwhile
if
(!StackEmpty(s))
//通过下一次循环中的内嵌while实现右子树遍历
{
p=pop(s);
p=p->rchild;
}//endif
}//endwhile
}//PreOrderUnrec
2.中序遍历非递归算法
#define maxsize 100
typedef struct
{
Bitree
Elem[maxsize];
int top;
}SqStack;
void InOrderUnrec(Bitree t)
{
SqStack s;
StackInit(s);
p=t;
while (p!=null ||
!StackEmpty(s))
{
while
(p!=null)
//遍历左子树
{
push(s,p);
p=p->lchild;
}//endwhile
if
(!StackEmpty(s))
{
p=pop(s);
visite(p->data);
//访问根结点
p=p->rchild;
//通过下一次循环实现右子树遍历
}//endif
}//endwhile
}//InOrderUnrec
3.后序遍历非递归算法
#define maxsize 100
typedef enum{L,R} tagtype;
typedef struct
{
Bitree ptr;
tagtype tag;
}stacknode;
typedef struct
{
stacknode
Elem[maxsize];
int top;
}SqStack;
void PostOrderUnrec(Bitree t)
{
SqStack s;
stacknode x;
StackInit(s);
p=t;
do
{
while
(p!=null)
//遍历左子树
{
x.ptr =
p;
x.tag =
L;
//标记为左子树
push(s,x);
p=p->lchild;
}
while
(!StackEmpty(s) &&
s.Elem[s.top].tag==R)
{
x =
pop(s);
p =
x.ptr;
visite(p->data);
//tag为R,表示右子树访问完毕,故访问根结点
}
if
(!StackEmpty(s))
{
s.Elem[s.top].tag =R;
//遍历右子树
p=s.Elem[s.top].ptr->rchild;
}
}while
(!StackEmpty(s));
}//PostOrderUnrec
转自:http://www.cnblogs.com/baoyu/archive/2005/08/29/225486.html
相关文章推荐
- 【课本】二叉树前序、中序、后序三种遍历的非递归算法
- 二叉树先序、中序、后序三种遍历的非递归算法
- 先序、中序、后序遍历(三种情况访问二叉树)
- 二叉树三种遍历方式,先序、中序、后序
- 二叉树的三种遍历(前序,中序,后序)
- 用Java语言实现二叉树的三种遍历(先序、中序、后序遍历)
- 二叉树前序、中序、后序三种遍历的非递归算法
- 从递归的异同分析二叉树先序、中序、后序遍历共同流程并实现非递归方式的三种遍历。
- 有关二叉树的三种遍历方式------先序,中序,后序
- LeetCode 根据前序和中序遍历构造二叉树的三种解法
- 二叉树先序、中序、后序三种遍历的非递归算法
- Java 二叉树前序、中序、后序三种遍历
- 二叉树的建立和三种遍历(先序、中序和后序)
- 二叉树前序、中序、后序三种遍历的非递归算法
- 二叉树的前序、中序、后序三种遍历的六种实现方式(递归、非递归)(C++)
- 二叉树的创建与三种遍历(先序,中序,后序)
- 二叉树三种遍历方式,有先序,中序或者后序,中序恢复二叉树等操作
- [转载]二叉树先序、中序、后序三种遍历的非递归算法
- 二叉树的三种遍历方式,前序、中序和后序。
- 二叉树三种遍历的非递归算法(背诵版)本贴给出二叉树先序、中序、后序三种遍历的非递归算法,此三个算法可视为标准算法,直接用于答题。