遍历二叉树之前,需要先熟悉二叉树的特点。
非空二叉树的特殊性:左右子树有序、每个节点的结构相同(根节点和左右分支,左右分支可能为空)、完全二叉树的节点编号的特殊规律。
遍历的实现思路:递归实现、非递归实现。按照中序遍历举例进行对比。
解释:中序遍历 (或称为中根遍历,比较好理解)按照从左子树向右子树的顺序。先遍历左子树、中间遍历根节点、后遍历右子树)
- 递归实现
个人观点:递归算法,只要你想明白了二叉树基本构成元素的抽象性、理解了递归就是针对相同结构的不断调用知道最后一层,那么代码写起来就相当简洁,但是如果你不理解就很难言传(只可意会,我也是不写代码了以后才研究懂,开慧甚晚~)。
某个二叉树如下
这个二叉树的基本构成元素可以看成如下的拆分
虚线的部分代表这个分支的线是虚拟出来的,因为它的下级没有实际的节点。
通过以上的画图可以看出,二叉树的基本构成元素就是集合{节点,左分支线,右分支线},那么遍历整个树可以拆解成遍历每个基本构成元素,所以递归遍历便是用了这种结构。
递归遍历二叉树的核心思想:中序遍历左子树、中序遍历根节点、中序遍历右子树。遍历左子树的时候,又会在每一层按遍历左子树、根节点、右子树的顺序进行…。
做法:定义二叉树为 BTree类型,中序遍历的函数名为inOrderTree。
//定义二叉树
typedef struct BTree{
DataType data;
BTree *Lchild,*Rchild;
}
//中序遍历
void InOrderTree(BTree T){
if(T != Null){//非空树
InOrder(T->Lchild);
Visit(T);
InOrder(T->Rchild);
}
}
- 非递归实现:见下一篇吧~~