二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中的所有结点,使得 每个结点被访问且被访问一次。
这个计算机她不像我们人一样是长了一双睿智的眼睛,一看这个二叉树的图就知道该怎么简单地遍历完这棵二叉树,但就这么简单的的事搁在计算机眼里就只有无限的循环和判断,因为她比我们理性多了。
1、先(前)序遍历:
若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树。
void PreOrder( BTNode * b) {
if ( b !=NULL) {
printf("%c",b ->data); //先访问根结点
PeOrder (b ->lchild); //先序遍历左子树
PreOrder (b ->rchild); //先序遍历右子树
}
}
2、中序遍历(垂线大法)
若树为空,则空操作返回,否则从根结点开始(注意并不是先访问根结点),中序遍历根结点的左子树,然后是访问根结点,最后中序遍历右子树。
void InOrder (BTNode *b) {
if (b != NULL) {
InOrder(b ->lchild); //中序遍历左子树
printf("%c",b ->data); //访问根结点
InOrder(b ->rchild); //中序遍历右子树
}
}
3、后序遍历
若树为空,则空操作返回,否则从左到右先叶子后结点的方式遍历访问左右子树,最后是访问根结点。
void PostOrder( BTNode * b) {
if ( b !=NULL) {
PeOrder (b ->lchild); //先序遍历左子树
PreOrder (b ->rchild); //先序遍历右子树
printf("%c",b ->data); //访问根结点
}
}
4、层次遍历(非递归)
若树为空,则空操作返回,否则从树的第一层,也就是根结点开始访问,从上而下逐层遍历,在同一层中,按从左到右的顺序对结点逐个访问。
typedef struct {
BTNode *data [MaxSize]; //存放队列元素
int front ,rear; //队头和队尾指针
}SqQueue; //顺序队类型
void LevelOrder(BTNode *b) {
BTNode *p;
SqQueue *qu ; //定义环形队列
InitQueue(qu); //初始化队列
enQueue(qu,b); //根结点指针进入
while (!QueueEmpty(qu)) { //队列不空循环
deQueue(qu,p); //出队结点p
printf("%c", p->data); //访问节点p
if (p ->lchild !=NULL) //有左孩子的将其进队
enQueue(qu,p ->lchild);
if (p ->rchild) //有右孩子的将其进队
enQueue (qu ,p ->rchild);
}
}