/*二叉树的遍历-非递归(堆栈实现)*/
typedef struct TreeNode *BinTree;
typedef BinTree Position;
struct TreeNode{
ElementType Data;
BinTree Left;
BinTree Right;
};
/*中序遍历的非递归遍历算法*/
void InOrderTraversal(BinTree BT)
{
if(BT==NULL) //判断是否为空树
return;
BinTree T=BT;
Stack S=CreatStack(MaxSize); //创建并初始化堆栈S
while(T||!IsEmpty(S)){
while(T){ //一直向左遍历并将沿途结点压入堆栈
Push(S,T);
T=T->Left;
}
//当S为空表示已经到达左子树最下面,这时候需要出栈
if(!IsEmpty(S)){
T=Pop(S); //结点弹出堆栈
printf(%5d,T->Data); //访问(打印)结点
T=T->Right; //转向右子树 ,开始新一轮的左子树遍历
}
}
}
/*先序遍历的非递归遍历算法*/
void PreOrderTraversal(BinTree BT)
{
if(BT==NULL) //判断是否为空树
return;
BinTree T=BT;
Stack S=CreatStack(Maxsize);
while(T||!IsEmpty(S)){
//边遍历边打印,并存入栈中,之后需要借助这些根结点进入右子树
while(T){
printf("%5d",T->Data);
Push(T);
T=T->Left;
}
if(!ISEmpty(S)){
T=Pop(S);
T=T->Right;
}
}
}
/*后序遍历非递归遍历算法*/
void PostOrderTraversal(BinTree BT)
{
if(BT==NULL) //判断是否为空树
return;
BinTree T=BT;
Stack S=CreatStack(Maxsize);
BinTree LastVisit=NULL;
//将T移动至左子树的最下边
while(T){
Push(S,T);
T=T->Left;
}
while(!IsEmpty(S)){
T=Pop(S);
//如果当前结点的右子树为空或者右子树已经被访问过了,则直接访问其根结点
if(T->Right=NULL||T->Right=LastVisit){
//修改最近被访问的结点
LastVisit=T;
}
else if(T->Left=LastVisit) //如果左子树刚被访问过,则需先进入右子树(根结点需要再次入栈
{
//根结点再次入栈
Push(S,T);
//进入右子树,且可以肯定右子树一定不空
T=T->Right;
while(T){
Push(S,T)
T=T->Left;
}
}
}
printf("%5d",T->Data);
}
二叉树的遍历(非递归实现)
最新推荐文章于 2020-10-05 20:35:05 发布