一、前序遍历
顺序为: 根-->左子树---->右子树
先访问根节点,再递归进入根节点的左子树(通过递归不断往下遍历),直到访问的节点没有左子树,此时递归进入其右子树(通过递归进行相同操作),直至所有的节点都被访问过,访问的顺序即为前序遍历。
前序遍历的代码: (可以根据前序遍历的代码推出前序遍历的过程)
typedef struct BiTNode{
int data;
struct BiTNode* lchild, * rchild;
}BiTNode,*BiTree;
void PreOrder(BiTree T) // 前序遍历
{
if (T!=NULL)
{
visit(T); 访问根结点
PreOrder(T->lchild); //递归遍历左子树
PreOrder(T->rchild); //递归遍历右子树
}
}
前序遍历的过程(图示)
以如下二叉树为例:进行先访问根,再左子树,右子树的顺序遍历(递归)
前序遍历的访问顺序:
前序遍历的顺序为: ABDECF
二、中序遍历
顺序为: 左子树----> 根 ------> 右子树
先递归进入根结点的左子树结点,再访问根结点,最后递归进入根结点的右子树结点;如果其左子树或右子树为分支结点,则需要对分支结点再进行一遍中序遍历。
中序遍历代码:
void InOrder(BiTree T) // 中序遍历
{
if (T!=NULL)
{
InOrder(T->lchild); //递归遍历左子树
visit(T); //访问根结点
InOrder(T->rchild); //递归遍历右子树
}
}
同样以上述二叉树为例进行图示:
可以发现:中序遍历的顺序即为二叉树中节点并排时的从左到右
三、后序遍历
过程:左子树---->右子树----->根
先递归进入根结点的左子树结点,再递归进入根结点的右子树结点,最后访问根结点;如果其左子树或右子树为分支结点,则需要对分支结点再进行一遍后序遍历。
代码:
void PostOrder(BiTree T) // 后续遍历
{
if (T!=NULL)
{
PostOrder(T->lchild); //递归遍历左子树
PostOrder(T->rchild); //递归遍历右子树
visit(T); //访问根结点
}
}
图示过程:
后序遍历不能直接通过二叉树写出,需要根据代码的思路过程拓展。