文章目录
- 二叉树的遍历是按一定的次序访问树中的所有结点,使每个结点恰好被访问一次。其中遍历次序保证了二叉树上每个结点均被访问一次切仅有一次。
- 遍历就是把二叉树结点按某种次序排列成线性序列。
一. 遍历二叉树的三种操作定义
(一). 先序遍历(DLR)
若二叉树非空,则:
- 访问根结点;
- 先序遍历左子树;
- 先序遍历右子树。
(二). 中序遍历(LDR)
若二叉树非空,则:
- 中序遍历左子树;
- 访问根结点;
- 中序遍历右子树。
(三). 后序遍历(LRD)
若二叉树非空,则:
- 后序遍历左子树;
- 后序遍历右子树;
- 访问根结点。
如图:
二. 遍历二叉树的三种算法实现
(一). 先序遍历
void PreOrder(BiTNode *bt)
{
if(bt!=NULL)
{
printf("%c",bt->data);
PreOrder(bt->lchild);
PreOrder(bt->rchild);
}
}
(二). 中序遍历
void InOrder(BiTNode *bt)
{
if(bt!=NULL)
{
InOrder(bt->lchild);
printf("%c ",bt->data);
InOrder(bt->rchild);
}
}
(三). 后序遍历
void PostOrder(BiTNode *bt)
{
if(bt!=NULL)
{
PostOrder(bt->lchild);
PostOrder(bt->rchild);
printf("%c ",bt->data);
}
}
三. 先序遍历的非递归算法设计
- 先用栈保存根结点(指针)
- 右孩子先进,左孩子后进栈,因为栈后进后出。
void PostOrder(BiTNode *bt)
{
BiTNode *p;
SqStack *st; //定义栈指针st
InitStack(st); //初始化栈st
if(b!=NULL)
{
Push(st,b); //根结点进栈
while(!StackEmpty(st)) //栈不空时循环
{
Pop(st,p); //退栈结点p并访问它
printf("%c ",p->data);
if(p->rchild!=NULL) //有右孩子时将其进栈
Push(st,p->rchild);
if(p->lchild!=NULL) //有左孩子时将其进栈
Push(st,p->lchild);
}
}
}