树的遍历分为先序遍历,中序遍历以及后续遍历。其中分为递归形式与非递归形式,及层次遍历。
先序遍历:
首先访问根节点,然后访问左子树,最后访问右子树。
void PreOrder(BiTree T)
{
if(p)
{
visit(p);
PreOrder(p->lchild);
PreOrder(p->rchild);
}
}
中序遍历:
首先访问左子树,然后访问根节点,最后访问右子树。
void InOrder(BiTree T)
{
if(p)
{
InOrder(p->lchild);
visit(p);
InOrder(p->rchild);
}
}
后序遍历:
首先访问左子树,然后访问右子树,最后访问根节点。
void InOrder(BiTree T)
{
if(p)
{
PostOrder(p->lchild);
PostOrder(p->rchild);
visit(p);
}
}
以上三种都是递归形式,下面说一下非递归形式的中序遍历。这里采用了栈:
void InOrder2(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 levelOrder(BiTree T)
{
InitQueue(Q);
BiTree p = T;
EnQueue(Q,p);
while(p || !isEmpty(Q))
{
DeQueue(Q,p);
visit(p);
if(p->lchild)
EnQueue(Q,p->lchild);
if(p->rchild)
EnQueue(Q,p->rchild);
}
}