//解读:根左右,左根右,左右根分别是前序,中序,后序
//*******************************************************
void preorder(BiTree T)
{//先序遍历
if (T != NULL)
{
print(T->data);//访问根节点
preorder(T->lchild);//遍历左子树
preorder(T->rchild);//遍历右子树
}
}
void inorder(BiTree T)
{
if (T != NULL)
{
inorder(T->lchild);//遍历左子树
print(T->data);//访问根节点
inorder(T->rchild);//遍历右子树
}
}
void postorder(BiTree T)
{
if (T != NULL)
{
postorder(T->lchild);//遍历左子树
postorder(T->rchild);//遍历右子树
print(T->data);//访问根节点
}
}
void NPreOrderTraverse(BiTree T)
{//非递归先序遍历
BiTree p;//指向结构体的指针
SqStack S;
InitStack(&S);
Push(&S, (ELEM)T);//根指针入栈
while (StackEmpty(S))
{
while (GetTop(S,(ELEM*)&p) && p) { print(p->data); Push(&S,(ELEM)p->lchild); }
Pop(&S, (ELEM*)&p);//空指针出栈
if(StackEmpty(S))
{
Pop(&S, (ELEM*)&p);
Push(&S, (ELEM)p->rchild);
}
}
}
void NInOrderTraverse(BiTree T)
{//非递归中序遍历
BiTree p;//指向结构体的指针
SqStack S;
InitStack(&S);
Push(&S, (ELEM)T);//根指针入栈
while (StackEmpty(S))
{
while (GetTop(S, (ELEM*)&p) && p)
Push(&S, (ELEM)p->lchild); //左孩子入栈,一直向左走到尽头
Pop(&S, (ELEM*)&p);//向上走一层,空指针出栈
if (StackEmpty(S))//如果栈不空说明右孩子没有遍历
{
Pop(&S, (ELEM*)&p);//p为弹出的元素
print(p->data);//输出栈顶元素
Push(&S, (ELEM)p->rchild);
}
}
}
void NPostOrderTraverse(BiTree T)
{//非递归后序遍历
BiTree p,r;//指向结构体的指针
SqStack S;
int flag;
InitStack(&S);
Push(&S, (ELEM)T);//根指针入栈
while (StackEmpty(S))
{//左孩子走到头,看有没有右孩子,有右孩子从右孩子开始继续向左走到头
while (GetTop(S, (ELEM*)&p) && p) Push(&S, (ELEM)p->lchild);
Pop(&S, (ELEM*)&p);//空指针出栈
while ((flag = GetTop(S, (ELEM*)&r)) && r->rchild == p)
{
print(r->data);
Pop(&S, (ELEM*)&p);
}
if (flag)
Push(&S, (ELEM)r->rchild);
}
}
树的遍历
最新推荐文章于 2023-03-14 17:04:32 发布