#include<stdio.h>
typedef struct BiTree()
{
int data;
struct BiTree *lchild,*rchild;
}BiTNode,*BiTree;
/*------------------------------------------------*/
//递归遍历
//先序遍历
void PreOrder(BiTree T)
{
if(T!=NULL)
{
visit(T);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
//中序遍历
void InOrder(BiTree T)
{
if(T!=NULL)
{
InOrder(T->lchild);
visit(T);
InOrder(T->rchild);
}
}
//后序遍历
viod PostOrder(BiTree T)
{
if(T!=NULL)
{
PostOrder(T->lchild);
PostOrder(T->rchild);
visit(T);
}
}
/*------------------------------------------------*/
//非递归遍历
//先序遍历
void PreOrder1(BiTree T)
{
InitStack(S);
BiTree r,p = T;
r = NULL;
while(p || !IsEmpty(S))
{
if(p)
{
Push(S,p);
visit(p);
p = p->lchild;
}
else
{
GetTop(S,p);
if(p->rchild)
{
Pop(S,p);
p = p->rchild;
}
else
{
Pop(S,p);
GetTop(S,p);
p = NULL;
}
}
}
}
//中序遍历
void InOrder1(BiTree T)
{
InitStack(S);
BiTree p = T;
while(p || !IsEmpty(S) )
{
if(p)
{
Push(S,p);
p = p->lchild;
}
else
{
Pop(S,p);
visit(p);
p = p->rchild;
}
}
}
//后序遍历
void PostOrder1(BiTree T)
{
InitStack(S);
BiTree p = T;
r = NULL; //辅助指针,指向最近访问的结点
while(p || !IsEmpty(S))
{
if(p) //走到最左边
{
Push(S,p);
p = p->lchild;
}
else //向右
{
Get(S,p);
if(p->rchild && p->rchild != r) //如果右子树存在,且未被访问
{
p = p->rchild; //向右转
Push(S,p); //压入栈
p = p->lchild; //向左查找
}
else //如果右子树不存在,或已经被访问了
{
Pop(S,p); //弹出结点
visit(p->data); //访问该结点
r = p;
p = NULL;
}
}
}
}
/*------------------------------------------------*/
//二叉树的层次遍历(非递归,队)
void LevelOrder(BiTree T)
{
InitQueue(Q);
BiTree q;
EnQueue(Q,T);
while(!Isempty(Q))
{
DeQueue(Q,q);
if(q.lchild!=NULL)
{
EnQueue(Q,q.lchild);
}
if(q.rchild!=NULL)
{
EnQueue(Q,q.rchild);
}
}
}
二叉树的三序(递归非递归)遍历
最新推荐文章于 2025-07-12 19:57:57 发布