参考
- 《大话数据结构》
- 本笔记仅作学习记录使用
1. 前序遍历
规则:按照先访问根,再访问左子树,最后访问右子树的方式(根->左->右)
// 前序遍历
void PreOrderTraverse(BiTree T)
{
if(T==NULL)
return ;
printf("%c",T->data); // 显示结点数据,也可以是其他操作
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
访问顺序:ABDGHCEIF
中序遍历
规则:按照先访问左子树,然后根结点(是指当前子树的根结点,而不是整棵树的根节点),最后右子树(左->根->右)
如该图中,黄色框图标记的这棵子树中,D 就是该子树的根结点
// 中序遍历
void InOrderTraverse(BiTree T)
{
if(T==NULL)
return ;
InOrderTraverse(T->lchild);
printf("%c",T->data);
InOrderTraverse(T->rchild);
}
访问顺序:GDHBAEICF
后续遍历
规则:按照先左子树,然后右子树,最后根结点(依然是当前子树的根结点)的顺序(左->右->根)
// 后序遍历
void PostOrderTraverse(BiTree T)
{
if(T==NULL)
return ;
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%c",T->data);
}
访问顺序:GHDBIEFCA
其实,所谓的前,中,后序,是指根被访问的次序。如前序,根就第一个被访问,中序,根就第二个被访问。
层序遍历
层序遍历就是从跟结点开始,逐层,每层从左至右扫描。
访问顺序:ABCDEFGHL
void LevelOrder(BiTree b)
{
InitQueue(Q);
BiTree p;
EnQueue(Q,b); //根结点进队
while(IsEmpty(Q))
{
//队列不空循环
DeQueue(Q,p)
//队头元素出队
printf(“%c”,p->data);
if(p->lchild!=NULL)
EnQueue(Q,p->lchild);
if(p->rchild!=NULL)
EnQueue(Q,p->rchild);
}
}
**note
- 层序遍历在算法思想上和图的广度优先遍历很类似**