什么是遍历
-
遍历:按照某种次序把所有结点 都访问一遍
-
层次遍历:基于树的层次特性确定的次序规则
- 先/中/后序遍历:基于树的递归特性确定的次序规则
二叉树的遍历
二叉树的递归特性:
- 要么就是个空二叉树
- 要么就是有“根节点+左子树+右子树”组成的二叉树
遍历方式
- 先序遍历:根左右(NLR)
- 中序遍历:左根右(LNR)
- 后序遍历:左右根(LRN)
下面是一些遍历方式例图
先序遍历
操作过程:
-
若二叉树,则什么都不做;
-
若二叉树非空:
- 访问根节点
- 先序遍历左子树
- 先序遍历右子树
/**
* 二叉树的前序遍历:根左右
* @param biTree 二叉树
*/
void preOrder(BiTree biTree) {
//递归结束
if (biTree == NULL) {
return;
}
printf("%d\t", biTree->data);
//左子树,因为子树和根都是一样的数据结构所以可以直接递归
preOrder(biTree->lChild);
//右子树,因为子树和根都是一样的数据结构所以可以直接递归
preOrder(biTree->rChild);
}
流程展示(下面中序遍历和后序遍历类似)
中序遍历
操作过程:
-
若二叉树,则什么都不做;
-
若二叉树非空:
- 先序遍历左子树
- 访问根节点
- 先序遍历右子树
/**
* 二叉树的中序遍历:左根右
* @param biTree 二叉树
*/
void midOrder(BiTree biTree) {
//递归结束
if (biTree == NULL) {
return;
}
//左子树,因为子树和根都是一样的数据结构所以可以直接递归
midOrder(biTree->lChild);
//根节点data打印
printf("%d\t", biTree->data);
//右子树,因为子树和根都是一样的数据结构所以可以直接递归
midOrder(biTree->rChild);
}
后序遍历
操作过程:
-
若二叉树,则什么都不做;
-
若二叉树非空:
- 先序遍历左子树
- 先序遍历右子树
- 访问根节点
/**
* 二叉树的中序遍历:左根右
* @param biTree 二叉树
*/
void postOrder(BiTree biTree) {
//递归结束
if (biTree == NULL) {
return;
}
//左子树,因为子树和根都是一样的数据结构所以可以直接递归
postOrder(biTree->lChild);
//右子树,因为子树和根都是一样的数据结构所以可以直接递归
postOrder(biTree->rChild);
//根节点data打印
printf("%d\t", biTree->data);
}